#include <stdio.h>
int main(void)
{
int arr1[3][2];
int arr2[2][3];
printf("arr1: %p \n", arr1);
printf("arr1+1: %p \n", arr1 + 1);
printf("arr1+2: %p \n\n", arr1 + 2);
printf("arr2: %p \n", arr2);
printf("arr2+1: %p \n", arr2 + 1);
return 0;
}
2차원 배열을 선언하고 2차원 배열이름을 대상으로 증가 및 감소연산을 할 경우, 연산결과는 각 행의 첫 번째 요소의 주소 값이 된다. arr1이 1행의 첫 번째 요소를 가리키면, arr1 + 1이 반환하는 주소 값은 2행의 첫번째 요소, arr1 + 2가
반환하는 주소 값은 3행의 첫 번쨰 요소를 가리키게 된다.
둘다 2차원 배열임에도 불구하고 가로길이가 다르기 떄문에 포인터형이 다르다고 할 수 있다.
#include <stdio.h>
int main(void)
{
int arr1[2][2] = {
{1,2}, {3,4}
};
int arr2[3][2] = {
{1,2}, {3,4}, {5,6,}
};
int arr3[4][2] = {
{1,2}, {3,4}, {5,6}, {7,8}
};
int(*ptr)[2];
int i;
ptr = arr1;
printf("** Show 2,2 arr1 **\n");
for (i = 0; i < 2; i++)
{
printf("%d %d \n", ptr[i][0], ptr[i][1]);
}
ptr = arr2;
printf("** Show 3,2 arr2 **\n");
for (i = 0; i < 3; i++)
{
printf("%d %d \n", ptr[i][0], ptr[i][1]);
}
ptr = arr3;
printf("** Show 4,2 arr3 ** \n");
for (i = 0; i < 4; i++)
{
printf("%d %d \n", ptr[i][0], ptr[i][1]);
}
return 0;
}
이 코드는 배열의 인덱스에 접근할 떄 배열을 사용하는게 아니라 배열을 포인터에 대입해서 포인터로 사용해도 같은 결과를 나타낸다는 것을 보여준다.
2차원 배열이름의 특성과 주의사항
'배열 포인터'와 '포인터 배열'을 혼동하지 말자.
int *whoA[4]; // 포인터 배열
int (*whoB)[4]; // 배열 포인터
#include <stdio.h>
int main(void)
{
int num1 = 10, num2 = 20, num3 = 30, num4 = 40;
int arr2d[2][4] = { 1,2,3,4,5,6,7,8 };
int i, j;
int* whoA[4] = { &num1, &num2, &num3, &num4 }; // 포인터 배열
int(*whoB)[4] = arr2d; // 배열 포인터
printf("%d %d %d %d \n", *whoA[0], *whoA[1], *whoA[2], *whoA[3]);
for (i = 0; i < 2; i++)
{
for (j = 0; j < 4; j++)
printf("%d ", whoB[i][j]);
printf("\n");
}
return 0;
}
포인터 배열과 배열 포인터가 헷갈릴 떄 보면 좋을 코드이다.
#include <stdio.h>
void ShowArr2DStyle(int(*arr)[4], int column)
{
int i, j;
for (i = 0; i < column; i++)
{
for (j = 0; j < 4; j++)
printf("%d ", arr[i][j]);
printf("\n");
}
printf("\n");
}
int Sum2DArr(int arr[][4], int column)
{
int i, j, sum = 0;
for (i = 0; i < column; i++)
for (j = 0;j < 4; j++)
sum += arr[i][j];
return sum;
}
int main(void)
{
int arr1[2][4] = { 1,2,3,4,5,6,7,8 };
int arr2[3][4] = { 1,1,1,1,3,3,3,3,5,5,5,5 };
ShowArr2DStyle(arr1, sizeof(arr1) / sizeof(arr1[0]));
ShowArr2DStyle(arr2, sizeof(arr2) / sizeof(arr2[0]));
printf("arr1의 합: %d \n", Sum2DArr(arr1, sizeof(arr1) / sizeof(arr1[0])));
printf("arr2의 합: %d \n", Sum2DArr(arr2, sizeof(arr2) / sizeof(arr2[0])));
}
void ShowArr2DStyle(int(*arr)[4], int column)
{
...
}
int Sum2DArr(int arr[][4], int column)
{
...
}
이 코드에서 함수의 매개변수로 첫번째 인자값을 저렇게 받으면 어떻게 작동하는건지 이해를 못했다.
#include <stdio.h>
int main(void)
{
int a[3][2] = { {1,2} , {3,4}, {5,6} };
printf("a[0]: %p \n", a[0]);
printf("*(a+0: %p \n", *(a + 0));
printf("a[1]: %p \n", a[1]);
printf("*(a+2): %p \n", *(a + 1));
printf("a[1]: %p \n", a[2]);
printf("*(a+2): %p \n", *(a + 2));
printf("%d, %d \n", a[2][1], (*(a + 2))[1]);
printf("%d, %d \n", a[2][1], *(a[2] + 1));
printf("%d, %d \n", a[2][1], *(*(a + 2) + 1));
return 0;
}
a[0]을 출력하면 a배열의 a[0][0]이 출력되어서 1이 출력되어야 한다고 생각했는데 왜 주소값이 출력되는지 모르겠다.
'PROGRAMMING LANGUAGE > C' 카테고리의 다른 글
18강 다중포인터 (0) | 2021.09.16 |
---|---|
17-1 포인터 배열과 배열 포인터 (0) | 2021.09.16 |
16강 포인터의 사용법 (0) | 2021.09.15 |
15강 포인터와 배열 그리고 상수화 (0) | 2021.09.15 |
14강 포인터 (0) | 2021.09.15 |