2024. 4. 8. 18:33ㆍ정보처리,전산/Clang
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int ptr;
// 배열 포인터로 형변환
ptr = (int )arr;
// 배열을 포인터로 접근하여 요소 출력
for (int i = 0; i < 5; i++) {
printf("%d ", (ptr + i));
}
return 0;
}
2차원 배열 포인터
#include <stdio.h>
int main() {
int arr[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int (ptr)[3]; // 포인터를 배열의 행을 가리키도록 선언
ptr = (int ()[3])arr; // 2차원 배열을 가리키는 포인터로 형변환
// 배열을 포인터로 접근하여 요소 출력
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", ((ptr + i) + j));
}
printf("\n");
}
return 0;
}
이 예제에서는 3x3 크기의 2차원 배열 arr을 선언하고 ptr이라는 포인터를 선언한다.
ptr은 각각의 행을 가리키는 포인터이다.
`int (*ptr)[3];`는 "3개의 정수로 이루어진 배열을 가리키는 포인터"를 선언하는 것이다.
그리고 배열 arr을 가리키는 포인터로 형변환하여 ptr에 저장한다.
`ptr`은 2차원 배열의 각 행을 가리킬 수 있는 포인터가 된다.
`ptr = (int (*)[3])arr;`에서의 형변환은 `arr`을 `int (*)[3]` 형태의 포인터로 형변환하여 `ptr`에 할당하는 것이다.
`(int (*)[3])arr;`은 `arr`이라는 변수를 `int (*)[3]` 타입으로 형변환하는 것을 의미한다.
- `arr`: 2차원 배열의 이름이며, 이는 배열의 첫 번째 요소를 가리키는 포인터로 해석
- `(int (*)[3])`: 이 부분은 형변환 연산자로 특정한 형식으로 `arr`을 형변환하여 행이 3개의 `int` 요소로 이루어진 배열을 가리키는 포인터이며 `int (*)[3]` 형식으로 형변환하겠다는 것을 의미한다. 이러한 형변환을 통해 해당 포인터를 사용하여 2차원 배열의 각 행에 접근할 수 있게 된다.
따라서 `ptr`이 `arr`의 각 행을 가리킬 수 있으며 `ptr`을 사용하여 2차원 배열 `arr`의 각 행에 접근하고 요소에 접근할 수 있다.
- `ptr + 1`: `ptr`이 가리키는 위치에서 한 칸 아래로 이동한 곳에 있는 포인터를 나타낸다.
여기서 한 칸은 `arr`의 두 번째 행이다.
- `*(ptr + 1)`: `ptr`이 가리키는 위치에서 한 칸 아래로 이동한 곳에 있는 포인터이므로, 두 번째 행의 시작 주소를 나타낸다.
- `*(ptr + 1) + 2`: 두 번째 행의 시작 주소에서 두 칸 더 이동한 곳에 있는 포인터를 나타낸다. 여기서 두 칸은 두 번째 행에서 세 번째 요소를 가리킨다.
- `*(*(ptr + 1) + 2)`: `*(ptr + 1) + 2`가 가리키는 위치에 있는 값을 역참조하여 가져오는 것이므로, 두 번째 행에서 세 번째 요소의 값을 의미한다.
따라서 `*(*(ptr + 1) + 2)`는 `arr`의 두 번째 행에서 세 번째 요소의 값인 6이 된다.
'정보처리,전산 > Clang' 카테고리의 다른 글
비트연산 (0) | 2024.06.22 |
---|---|
call by reference (0) | 2024.06.16 |
랜덤 숫자 발생 후 입력 값 존재 유무 찾기 (0) | 2024.05.29 |
최빈값 구하기 (0) | 2024.05.16 |
(함수의 구조, 선언) 1~100까지의 합, 구구단 (0) | 2024.03.31 |