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

2020. 11. 12. 14:19개인공부/C언어

 

 

 

배열의 이름은 주소이다.( 첫번째 원소의 주소)

 

arr 이름이 a[0][0] 주소가 아니라 &arr[0] 이다.

 

arr[0]과 &arr[0]이 배열에서는 같다.

하지만 포인터의 배열에서는 달라진다.

 

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>



int main() {

	float arr2d[2][4] = { {1.0f,2.0f,3.0f,4.0f},{5.0f,6.0f,7.0f,8.0f} };

	//주소가 같다
	printf("%u\n", (unsigned)arr2d);
	printf("%u\n", (unsigned)arr2d[0]);
	printf("\n");

	// arr2d points to arr2d[0] (not arr2d[0][0])

	//주소가 다 같다
	printf("%u\n", (unsigned)* arr2d);
	printf("%u\n", (unsigned)& arr2d[0]);
	printf("%u\n", (unsigned)& arr2d[0][0]);
	printf("%f %f\n", arr2d[0][0], **arr2d);
	// 결과값 : 1.000000 1.000000
	printf("\n");

	// 모두 주소가 같다
	printf("%u\n", (unsigned)(arr2d + 1)); // 16바이트를 건너뜀
	printf("%u\n", (unsigned)(&arr2d[1]));
	printf("%u\n", (unsigned)(arr2d[1]));
	printf("%u\n", (unsigned)(*(arr2d + 1)));
	printf("%u\n", (unsigned)(&arr2d[0] + 1));
	printf("%u\n", (unsigned)(&arr2d[1][0]));
	printf("\n");

	printf("%f\n", *(*(arr2d + 1) + 2));
	printf("\n");

	for (int j = 0; j < 2; ++j)
	{
		printf("[%d] = %u, %u\n",
			j,
			(unsigned)(arr2d[j]),
			(unsigned)*(arr2d + j));
		for (int i = 0; i < 4; ++i) {
			printf("[%d][%d] = %f, %f\n", 
				j, i, arr2d[j][i], *(*(arr2d + j) + i));
		}
	}
	/*
	[0] = 5240664, 5240664
	[0][0] = 1.000000, 1.000000
	[0][1] = 2.000000, 2.000000
	[0][2] = 3.000000, 3.000000
	[0][3] = 4.000000, 4.000000
	[1] = 5240680, 5240680
	[1][0] = 5.000000, 5.000000
	[1][1] = 6.000000, 6.000000
	[1][2] = 7.000000, 7.000000
	[1][3] = 8.000000, 8.000000
	
	*/
	printf("\n");

	return 0;
}

 

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