인프런 커뮤니티 질문&답변

moveout123님의 프로필 이미지
moveout123

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.16 2차원 배열 arr2d의 역참조 횟수가 이해가 잘 안됩니다.

작성

·

391

0

arr2d[0][0]와 **arr2d가 같다고 말씀하시는 부분에서 의문이 들어 질문드립니다. arr2d 자체가 전에 강의에서 설명 하신것처럼 이중포인터가 아니라 그냥 2차원 배열이라 주소자체가 따로 저장되는게 아니라서 주소가 한단계 밖에 없는데 arr2d의 역참조(*)가 두번이나 될수 있는게 이해가 잘안되네요ㅠ 설명부탁드립니다!

답변 8

1

moveout123님의 프로필 이미지
moveout123
질문자

아아 감사합니다!

1

sizeof 와 pointer arithmetic 에서 차이가 있습니다.
한 번 시도해보셨으면 좋겠네요.
이전의 답변에서 error - > warning 수정했습니다. error는 c++에서만 나타나는군요.

1

moveout123님의 프로필 이미지
moveout123
질문자

아아 어느정도 이해가 됬습니다 감사합니다!! 하나만 더 물어보자면,

배열 arr[4] 자체에서, arr과 &arr 의 구조적인 차이가 있나요? 둘다 포인터값을 출력해보면 값은 똑같은데,

arr의 주소값인  &arr 과는 차이가 있어야 될거 같은데 arr자체가 배열의 첫번재 주소이니, 이것의 주소를 또 다시 찾는다는게 이해가 안되는거 같습니다... 그냥 문법적인 또 다른 표현인지 아니면 구조적으로 차이가 있는지 궁금하네요...

1

arr2d는 이중포인터는 아니지만... 한 번만 dereferencing 이 가능하다 라는 말은 틀립니다. 이중포인터라기 보다는 arr2d[i][j] 일 때 arr2d는 (*ptr)[j] 입니다. 함수의 parameter로 넘겨줄 때 이중포인터로 넘기면 warning이 나오고, 배열에 대한 포인터로 넘겨줘야 된다는 점을 볼 때 이 부분을 알 수 있습니다.

일반 변수를 가리키는 포인터에 대해서
int a = 0;
int ptr  = &a; 의 경우에
*ptr 이면 변수 a와 같은 것처럼

int arr[4];
int (*pa)[4]=&arr; 이면
*pa 일 때 arr 입니다.
여기서 arr의 원소에 접근하려면 dereferencing을 한 번 더 해주어야겠죠.
때문에 pa[0][0]; 이런 식으로 접근해줘야합니다.

1

한 번만 dereferencing 되는 경우에는 무엇이 와야한다고 생각하시나요? 사실 이중포인터도 포인터를 가리키는 포인터일뿐입니다.

1

안녕하세요?
이 부분은 10.14 강의의 10:10~ 쯤을 보시면 이해될 수 있겠군요. pa(pointer to array) 에 대한 내용입니다.

0

moveout123님의 프로필 이미지
moveout123
질문자

강의중에 이차원 배열의 제목 arr2d는 이중포인터가 아니라고 하셔서요.. 한번만 dereferencing 이 가능한 경우에는 ** 두개 쓰이는 거 자체가 오류가 되어야 하는게 아닌가 하는 생각이 듭니다...

예를들어 2차원 배열 arr2d를 역참조를 한번만 하고 나면(arr2d는 이중포인터가 아니라 2차원 배열의 제목일 뿐이니까요..) 바로 이차원 배열의 첫번째 주소를 역참조(*) 하게 되니 arr2d[0][0]의 데이터가 나오고, 이걸 다시 역참조(*) 할 경우 데이터를 다시 역참조를 하게 되는 거니 이상한 데이터 값이 나와야 되는거 아닌가요?

0

moveout123님의 프로필 이미지
moveout123
질문자

아아 10.14 강의내요 죄송합니다. 마찬가지로 pa도 포인터가 1단계 밖에 없는데(4byte로 찍힘) 이후 강의에 보시면 **pa라는 표현도 나오는데, 애초에 포인터가 1단계 뿐인데 역참조가 2번(**)이나 될수 있다는게 이해가 힘드네요 ㅠ

moveout123님의 프로필 이미지
moveout123

작성한 질문수

질문하기