본문 바로가기

PROGRAMMING LANGUAGE/C

17강 다차원 배열

#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