C언어 - 포인터의 배열과 2차원 배열

2020. 11. 12. 13:05개인공부/C언어

포인터의 배열을 이용한다면 배열의 배열을 만들수 있지않을까?

 

배열의 배열은 2차원배열 혹은 다차원 배열을 떠올릴수있다.

 

 

 

2차원 구조에서는 parr[0]이 하나의 행을 가르킨다 

 

 

 

 

 

 

1차원 구조에서는 일렬로 가르킨다.

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>



int main() {

	/* Two of 1D arrays*/

	////int arr0[3] = { 1,2,3 }; // 배열의 이름은 첫번째 주소처럼 사용할수있다.
	////int arr1[3] = { 4,5,6 };

	////int* parr[2] = { arr0, arr1 }; // an array of pointers
	// parr 포인터의 배열의 첫번째 원소에 arr0가 들어간다.
	// 포인터가 담길수있는 메모리 공간을 두개 확보한 배열이 되는것.

	//for (int j = 0; j < 2; ++j)
	//{
	//	for (int i = 0; i < 3; ++i)
	//		printf("%d(==%d, %d) ",
	//			parr[j][i],
	//			*(parr[j] + i),
	//			(*(parr + j))[i]);
	//	printf("\n");
	//}
	//printf("\n");





	/* 2D arrays are arrays of 1D arrays */

	//int arr[2][3] = { {1,2,3}, {4,5,6} };

	//int* parr0 = arr[0];
	//int* parr1 = arr[1];

	//for (int i = 0; i < 3; ++i)
	//	printf("%d ", parr0[i]);
	//printf("\n");

	//for (int i = 0; i < 3; ++i)
	//	printf("%d ", parr1[i]);
	//printf("\n");




	/* arrays of pointers works like a 2D array */

	int arr[2][3] = { {1,2,3}, {4,5,6} };

	// int * parr[2] = { arr[0], arr[1] };
	int* parr[2];
	parr[0] = arr[0];
	parr[1] = arr[1];

	for (int j = 0; j < 2; ++j)
	{
		for (int i = 0; i < 3; ++i)
			printf("%d %d %d %d\n",
					 arr[j][i],
					parr[j][i],
				*(parr[j] + i),
			*(*(parr + j) + i)
					);
		printf("\n");
	}
	printf("\n");



	// 포인터와 배열의 차이
	printf("%p\n", &parr[0]); // 포인터 array 자체의 주소
	printf("%p\n", parr[0]);  // 가르키고 있는 주소
	printf("%p\n", arr);	  // 첫번째 원소의 주소인것처럼 사용, 그렇지만 주소를 저장하는 별도의 메모리를 가지고 있지않다.
	printf("%p\n", &arr[0]);  // address of array name is equal to the address of the first
	printf("%p\n", arr[0]);	  // 
	printf("%p\n", &arr[0]);
	/*
	* 결과값
	010FFA1C  : &parr[0] 값 이외의 다른값은 다 같다.
	010FFA2C
	010FFA2C
	010FFA2C
	010FFA2C
	010FFA2C
*/

	char* name[] = { "Aladdin", "Jasmine", "Magic Carpet", "Genie" };

	const int n = sizeof(name) / sizeof(char*);
	//n이 4가 나온다. 
	// name이라는 포인터의 배열에 4개의 원소가 담겨있다는 뜻
	// 4개의 원소가 각 문자열의 첫번째 주소가 된다는 얘기

	for (int i = 0; i < n; ++i)
		printf("%s at %u\n", name[i], (unsigned)name[i]); //Use ull in x64 build
	printf("\n");



	char aname[][15] = { "Aladdin", "Jasmine", "Magic Carpet", "Genie", "Jafar" };
	// 메모리 공간은 두번째 차원에서 사이즈가 정해져 있는 2차원 배열

	const int an = sizeof(aname) / sizeof(char[15]);

	for (int i = 0; i < an; ++i)
		printf("%s at %u\n", aname[i], (unsigned)& aname[i]);// Use ull in x64 build
	printf("\n");

	return 0;
}

 

 

 

 

 

출처 : 홍정모의 따라배우는 C언어