18. 다차원 배열 그리고 포인터
I. 2차원 배열 이름의 포인터 타입
-
2차원 배열 이름이 가리키는 것은?
- 1차원 배열이름과 마찬가지로 배열의 첫번째 요소를 가리키는 포인터 이다. 다음의 소스를 보자
- #include <stdio.h>
- int main()
{
int a[3][2] = {1,2,3,4,5,6}; - printf("a[0] : %d\n",a[0]);
printf("a[1] : %d\n",a[1]);
printf("a[2] : %d\n",a[2]); - printf("a : %d\n",a);
- printf("a[0][0] : %d\n",&a[0][0]);
return 0;
}
- 위의 소스의 결과값을 보다 시피 a나 a[0]나 &a[0][0] 다 같은 주소값이 나온다.
- 2차원 배열 이름 +1 : 배열 이름을 이용한 포인터 연산
- #include <stdio.h>
- int main()
{
int a[3][2] = {1,2,3,4,5,6}; - printf("a : %d\n",a);
printf("a+1 : %d\n",a+1);
printf("a+2 : %d\n",a+2);
printf("a[0] : %d\n",a[0]);
printf("a[1] : %d\n",a[1]);
printf("a[2] : %d\n",a[2]);
return 0;
}
-
위에서 보면 a == a[0], a+1 == a[1], a+2 == a[2] 와 같은 결과가 나온다.
- 즉 2차원배열 이름은 포인터 연산시 행 단위로 이동을 한다.는 것이다.
-
포인터의 타입에는 이동에 대한 정보가 들어 있다.
- 임의의 두 포인터 타입이 일치 한다면, 기본적으로 포인터 연산에 의해 증가 및 감소되는 값의 크기가 일치해야 한다고 결론 내릴수 있다.
- #include <stdio.h>
- int main()
{
int a[3][2] = {1,2,3,4,5,6};
int b[2][3] = {0,}; - printf("a : %d\n",a);
printf("a+1 : %d\n",a+1);
printf("a+2 : %d\n",a+2);
printf("b : %d\n",b);
printf("b+1 : %d\n",b+1);
printf("b+2 : %d\n",b+2);
return 0;
}
-
위의 소스의 결과를 보다 시피 주소값들의 차이는 데이터형의 크기 * 열의 수 이다.
-
- 따라서 2차원 배열 이름의 포인터 타입은 어떤 데이터형이자, 포인터 연산 시 배열요소를 몇칸씩 건너 뛰는 포인터 라는 것을 알수 있다.
-
최종 결론! 배열 이름의 포인터 타입
-
배열 포인터
- int (*pArr)[4]와 *pArr[4] 차이점
- int *pArr[4] 는 pArr[][4] 이런식으로 생각을 하면 편할 것이다.
-
- 2차원 배열에서의 arr[i]와 *(arr+1)
- #include <stdio.h>
- int main()
{
int a[3][2]={0,}; - printf("a[0] : %d\n",a[0]);
printf("*(a+0) : %d\n",*(a+0)); - printf("a[1] : %d\n",a[1]);
printf("*(a+1) : %d\n",*(a+1)); - printf("a[2] : %d\n",a[2]);
printf("*(a+2) : %d\n",*(a+2)); - printf("%d, %d\n",a[1][0],(*(a+1))[0]);
return 0;
}
- 위와 같이 arr[i]와 *(arr+1)는 같은 거라는 것을 알 수 있다. 또 2차원 배열 같은 경우 a[1][0],(*(a+1))[0] 이런식으로 나타 낼수 있다.
문제
18 -1
문제 1
a와 a[0]가 같고 a+1과 a[1]이 가 같은 의미를 지니는 것으로 보인다. 실제로 가리키는 주소 값은 같지만 특성에 있어서는 다소 차이를 지닌다. 다음 예제를 직접 실행해 보고, 어떠한 특성적 차이가 있는지 결론을 내려보기 바란다.
- #include<stdio.h>
- int main()
- {
- int arr[3][2] = {1,2,3,4,5,6};
- printf("arr : %d\n,",sizeof(arr));
- printf("arr[0] : %d\n",sizeof(arr[0]));
- printf("arr[1] : %d\n",sizeof(arr[1]));
- printf("arr[2] : %d\n",sizeof(arr[2]));
- return 0;
- }
18 -2
문제 1
다음 코드를 보고 빈칸에 들어갈 적절한 포인터 선언을 해보자
- #include<stdio.h>
- int main()
- {
- int* arr1[5];
- int* arr2[3][5];
- = arr1;
- = arr2;
- return 0;
- }
이 글은 스프링노트에서 작성되었습니다.
'2. C/C++ > 01. C' 카테고리의 다른 글
21. 문자와 문자열 처리 함수 (0) | 2008.12.07 |
---|---|
19. 함수포인터와 void 포인터 (0) | 2008.12.07 |
17. 포인터의 포인터 (0) | 2008.12.07 |
16. 다차원 배열 (0) | 2008.12.07 |
14. 포인터와 함수에 대한 이해 (0) | 2008.12.07 |