나의 작은 valley

[C언어] 포인터의 배열 본문

Computer Science/[C언어] 문법 정리

[C언어] 포인터의 배열

붕옥 아이젠 2022. 9. 26. 22:55
728x90

//1차원 배열 2개를 포인터의 배열로 구현하기

 

#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 };	//배열의 이름은 배열의 첫번쨰 원소의 주소인 것처럼 사용할 수 있다.

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

	return 0;
}

1차원 배열 두개를 만든 뒤 각각을 포인터의 배열의 원소로 넣어준다. 이떄 두가지 방법으로포인터의 배열의 모든 원소를 출력하였다.

 

 

 

 

//2차원 배열을 포인터의 배열로 구현하기

#include <stdio.h>

int main() 
{
	/* 2D arrays */
	int arr[2][3] = { { 1,2,3 } ,{ 4,5,6 } };

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

	return 0;
}

 

 

 

 

그림으로 이해하기)

 

 

 

 

 *(*(parr+j)+i) 이해하기)

 

포인터 산술을 통해 parr이라는 배열의 j번쨰 원소의 주소를 가져온다. 이후에 가져온 배열의 i 번째 원소의 주소를 가져온다. 그 주소의 값을 %d에 넣어준다.

 

 

 

 

//2차원 배열과 포인터

 

//다차원 배열 역시 내부적으로는 일차원 배열로 저장되어 있다.

이떄 n차원 인덱스부터 저장된다

 

가령 int arr[2][3][4] ={ 생략 } 이라면

arr[0][0][0] >> arr[0][0][1] >> arr[0][0][2] ... >>arr[1][2][3] 와 같은 순서로 메모리에 저장된다.

 

 

 

//배열의 주솟값 확인

#include <stdio.h>

int main() 
{
	float arr2d[2][4] = { {10.f,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("%u\n", (unsigned)arr2d[0][0]);
    

	return 0;
}

arr2d와 arr2d[0] 의 주소는 같다. 그런데 arr2d[0]이 가르키는 주소는 다시 arr2d[0][0]와 같아서 결론적으로 arr2d가 가르키는 주소와 arr2d[0][0] 이 가르키는 주소가 같다.

 

 

 

//arr2d[[1][0]의 주소 확인

#include <stdio.h>

int main() 
{
	float arr2d[2][4] = { {10.f,2.0f,3.0f,4.0f},{5.0f,6.0f,7.0f,8.0f} };

	printf("%u\n", (unsigned)(arr2d+1));
	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("%f	\n", arr2d[1][0]);

	return 0;
}

모두 같은 주소값이 나온다. 

 

 

 

 

//포인터의 배열과 포인터

#include <stdio.h>

int main() 
{
	float arr2d[2][4] = { {10.f,2.0f,3.0f,4.0f},{5.0f,6.0f,7.0f,8.0f} };

	float(*pa)[4];	//4개의 float를 가진 배열에 대한 포인터
	float* ap[2];	//포인터의 배열 2개

	printf("%zu\n", sizeof(pa));	//4(byte)
	printf("%zu\n", sizeof(ap));	//8(byte)	

	return 0;
}

 

728x90
Comments