작성
·
391
0
arr2d[0][0]와 **arr2d가 같다고 말씀하시는 부분에서 의문이 들어 질문드립니다. arr2d 자체가 전에 강의에서 설명 하신것처럼 이중포인터가 아니라 그냥 2차원 배열이라 주소자체가 따로 저장되는게 아니라서 주소가 한단계 밖에 없는데 arr2d의 역참조(*)가 두번이나 될수 있는게 이해가 잘안되네요ㅠ 설명부탁드립니다!
답변 8
1
1
sizeof 와 pointer arithmetic 에서 차이가 있습니다.
한 번 시도해보셨으면 좋겠네요.
이전의 답변에서 error - > warning 수정했습니다. error는 c++에서만 나타나는군요.
1
아아 어느정도 이해가 됬습니다 감사합니다!! 하나만 더 물어보자면,
배열 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
1
0
강의중에 이차원 배열의 제목 arr2d는 이중포인터가 아니라고 하셔서요.. 한번만 dereferencing 이 가능한 경우에는 ** 두개 쓰이는 거 자체가 오류가 되어야 하는게 아닌가 하는 생각이 듭니다...
예를들어 2차원 배열 arr2d를 역참조를 한번만 하고 나면(arr2d는 이중포인터가 아니라 2차원 배열의 제목일 뿐이니까요..) 바로 이차원 배열의 첫번째 주소를 역참조(*) 하게 되니 arr2d[0][0]의 데이터가 나오고, 이걸 다시 역참조(*) 할 경우 데이터를 다시 역참조를 하게 되는 거니 이상한 데이터 값이 나와야 되는거 아닌가요?
0
아아 10.14 강의내요 죄송합니다. 마찬가지로 pa도 포인터가 1단계 밖에 없는데(4byte로 찍힘) 이후 강의에 보시면 **pa라는 표현도 나오는데, 애초에 포인터가 1단계 뿐인데 역참조가 2번(**)이나 될수 있다는게 이해가 힘드네요 ㅠ