#include <stdio.h>
int main(void)
{
int i,j;
int a[2][3] = {
{1,2,3},
{4,5,6}
};
int* ap[2];
for(i=0;i<2;i++){
ap[i]=a[i];
for(j=0;j<3;j++)
printf("%d ",ap[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<2;i++){
for(j=0;j<3;j++)
printf("%d ",(*(ap+i))[j]);
printf("\n");
}
printf("\n");
int (*pa)[3];
pa=a;
for(i=0;i<2;i++){
for(j=0;j<3;j++)
printf("%d ",pa[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<2;i++){
for(j=0;j<3;j++)
printf("%d ",(*pa)[j]);
printf("\n");
pa++;
}
return 0;
}
배열 a와 포인터배열ap를 메모리상에 표현하면 이렇게 표현할 수 있다.
첫번째 for문
ap의 원소는 int* 형 이므로 a의 상위차수 인덱스 1번인덱스의 주소값을 가질 수 있다.
두번째 for문
주소의 더하기 빼기는 인덱스의 이동이다. 따라서 .ap가 참조하는 a의 주소에 1을 더하면 다음 인덱스로 넘어가게 된다.
그 후 하위차수 j을 순회해주면 모든 배열의 원소가 출력된다.
pa와 a
pa는 배열 포인터이다. a배열도 2차원 배열이고 pa도 2차원배열이므로 pa는 a의 주소를 가질 수 있다.
세번째 for문
마찬가지로 pa는 a이므로 pa[i][j]는 a[i][j]와 같다. 즉 모든 배열의 원소를 출력한다.
네번째 for문
(*pa)[j]는 ((*pa+0))[j]와 같다. ((*pa+0))[j] 는 pa[0][j]와 같다. 그러므로 (*pa)[j] 는 pa[0][j]와 같다.
pa++을 해주면 a의 주소에 +1을 해주는 것이므로 *(a+1)과 같다. 즉, 다음 인덱스로 넘어가게 된다.
이중포인터 문제
정답은 순서대로 **p, &words 이다. main()함수부터 보자면 문자열 *words의 주소를 위 함수로 보내야하므로 words의 주소를 보내야한다. &words는 주소의 주소이므로 2차원이다. 따라서 매개변수로는 이중포인터인 **p가 들어가야한다.
이걸 그림으로 하자면
이렇게 된다. words가 캐릭터포인터형이므로 words의 주소를 보낼려면 이중포인터가 필요하다. 매개변수로 **p를 보내야하고, *p가 가리키는 값을 words가 가리킨다.
+
int arr[2][2][2] = { 0,1,2,3,4,5,6,7 }; 의 a[1][1][1]을 다양한 방법으로 출력하라.
모두
이렇게 움직인다.
'학과 공부 > C & C++' 카테고리의 다른 글
[C++] iterator(반복자)에 대해서 알아보자 (0) | 2024.02.22 |
---|---|
[C++] fill 함수에 대해 알아보자 (0) | 2024.02.22 |
포인터의 활용(1)[C프로그래밍] (0) | 2023.11.17 |
union,enum,typedef[C프로그래밍] (0) | 2023.11.14 |
구조체(2)[C프로그래밍] (1) | 2023.11.03 |