포인터의 배열
포인터의 배열이란, 배열의 원소안에 포인터들이 들어가는 배열이다.
int *ap[10]; //10개의 주소가 들어갈 수 있는 포인터 배열 선언
포인터 배열은 이렇게 선언한다.
포인터의 배열을 사용하면 문자열을 저장할 때, 장점이 있다.
예를 들어, computer라는 2차원배열을 선언하고 원소를 넣어보자.
char computer[3][8] = {
"Mac",
"Samsung",
"Lenovo"
};
보통 이렇게 배열을 선언하고 초기화 할 것이다.
하지만, 이렇게 한다면 "Samsung"문자열은 8바이트를 다 사용하지만, Mac은 3바이트만 사용하게된다.
즉, "Mac"이란 문자열은 5바이트를 사용하지 않기때문에 메모리의 '낭비'가 생긴다.
그렇다면, 포인터의 배열을 사용하여 문자열을 저장해보자.
char *computer[3] = {
"Mac",
"Samsung",
"Lenovo"
};
이렇게 선언하고 초기화하면, 각 열에는 문자열들을 가르키는 '포인터'만이 열에 들어간다.
메모리를 낭비하지 않을 수 있다.
배열의 포인터
배열을 가르키는 포인터도 있다.
선언방법은,
int(*pa)[10]; //10칸짜리 배열을 가르키는 배열 포인터
이렇게 선언하는데, 10칸짜리 배열을 가르키는 배열 포인터이다.
그림으로 보면 이렇다.
우리는 배열의 이름이 첫 번째 배열 원소의 포인터(주소)라는 것을 알고있다.
반면, 배열포인터는 배열 전체에 대한 포인터이다.
차이점을 보자.
1. 배열의 이름 사용 : 첫번째 배열 원소의 포인터.
int arr[4] = {1, 2, 3, 4};
int *p;
p = arr; //배열의 첫번째 원소의 주소를 가르킨다.
*(p++);
*(p++) : p는 처음에 [0]을 가르킨다([0]의 주소를 예를들어 1000이라고 가정).
*(p++)을 하면, 일단 p가 가르키고있는 주소에서 ++때문에 4바이트 증가시킨다.
(1000을 가르키다가 1004를 가르킴).
그렇다면 p는 ++때문에 현재 1004주소를 가르키고 1004는 2가 들어있음.
즉, *(p++)는 2이다.
2. 배열포인터 사용 : 배열 자체를 가르킨다.
int arr[4] = {1, 2, 3, 4};
int (*p)[4];
p = &arr;
(*p)[2] = 3 이다.
(*p) : p가 가르키는 것. 즉, arr배열 자체를 가르킨다.
그러면, 우리는 (*p)를 arr처럼 사용할 수 있다.
(*p)[3]은 arr[3]과 같다.
'C프로그래밍 > 개인 공부' 카테고리의 다른 글
2차원 배열 포인터 형으로 함수 인자로 전달하기 (0) | 2023.02.12 |
---|---|
C언어 - 함수의 포인터 (0) | 2023.01.07 |
C언어 - 이중 포인터 (0) | 2023.01.03 |
C언어 - 연결리스트 (0) | 2022.12.20 |
C언어 - 동적 메모리 (0) | 2022.12.14 |