작성
·
201
·
수정됨
1
1차 배열에서 *ptr은 해당 첫번째 메모리의 값이엿는데
2차 배열에서 *ptr은 메모리값이 아니라 첫번째 메모리의 주손가요??
답변 1
1
안녕하세요, 답변 도우미 Soobak 입니다.
포인터 변수 ptr
을 어떻게 선언하였는지, 즉, 포인터의 자료형에 따라서 달라지게 된다고 말씀드리는 것이 보다 정확한 답변인 것 같습니다.
기본적으로, *
를 통해 역참조하여 ptr
포인터 변수가 가리키는 주소에 저장된 값을 읽어온다는 것은 동일합니다.
다만,
int arr[6] = {1, 2, 3, 4, 5, 6}; int *ptr = arr;
같은 경우와,
질문 주신 강의에서 등장하는 int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; int *ptr = &arr[0][0];
와 같은 경우를 비교해보면,
첫 번째의 경우, ptr
은 배열 arr
의 첫 번째 원소, 즉, arr[0]
의 주소를 가리킵니다.
이 때, *ptr
을 통해 ptr
이 가리키는 주소에 저장된 값을 역참조하면, 1
을 가리키게 됩니다.
두 번째의 경우에도, ptr
은 배열의 첫 번째 원소인 arr[0][0]
의 주소를 가리키며, *ptr
은 arr[0][0]
의 값인 1
을 의미합니다.
하지만, int (*ptr)[3] = arr
과 같이 선언한다면 ptr
은 arr
의 첫 번째 행을 가리키는 포인터가 되고, *ptr
은 arr[0]
이 됩니다. 즉, 첫 번째 배열(행)의 첫 번째 원소의 주소가 됩니다.
보다 자세한 내용은, 강의 10.14 2차원 배열과 포인터 에서 학습하시게 됩니다.
arr
배열이 int(*)[3]
타입이기 때문입니다.
따라서, int (*ptr)[3] = arr;
으로 선언해주거나, int (*)[3]
타입인 arr
을 int *
타입인 것으로 명시적 형변환을 해주어야 합니다.
arr이 2차원 배열일 때
ptr = arr은 왜 안 되는 걸까요