C언어 - 포인터의 배열과 2차원 배열
2020. 11. 12. 13:05ㆍ개인공부/C언어
포인터의 배열을 이용한다면 배열의 배열을 만들수 있지않을까?
배열의 배열은 2차원배열 혹은 다차원 배열을 떠올릴수있다.
#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언어
'개인공부 > C언어' 카테고리의 다른 글
C언어 - 포인터의 호환성(Compatibility) (0) | 2020.11.12 |
---|---|
C언어 - 2차원 배열과 포인터 (0) | 2020.11.12 |
C언어 - 포인터에 대한 포인터(2중 포인터)의 작동 원리 (0) | 2020.11.12 |
C언어 - 배열 매개변수와 const (0) | 2020.11.12 |
C언어 - const와 배열과 포인터 (0) | 2020.11.12 |