나의 작은 valley
[C언어] 포인터의 배열 본문
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
'Computer Science > [C언어] 문법 정리' 카테고리의 다른 글
[C언어]복합 리터럴과 배열 (1) | 2022.10.05 |
---|---|
[C언어] 다차원 배열을 매개변수로 사용하기,가변길이배열 (1) | 2022.10.05 |
[C언어] 이중 포인터의 작동원리 (1) | 2022.09.26 |
[C언어]배열을 매개변수로 사용하는 법 (0) | 2022.09.25 |
[C언어] 2차원 배열 문제 (1) | 2022.09.23 |
Comments