티스토리 뷰
2021.03.03.수
포인터 배열과 배열 포인터
int *p_arr[3];
✔ 포인터 배열 : 배열 요소로 포인터 변수를 가지는 배열을 의미. 즉, 포인터 변수를 저장할 수 있는 배열을 의미.
int (*arr_p)[3];
✔ 배열 포인터 : 배열 포인터란 배열을 가리킬 수 있는 포인터를 의미.
✔ 선언은 위와 같이 배열명 앞에 별(*)을 붙여 포인터임을 표시하고 괄호로 묶어 준다.
✔ 괄호 없이 선언하게 되면 포인터 배열로 선언되므로 주의하자.
int arr[2][3] = {
{10, 20, 30},
{40, 50, 60}
};
int (*arr_p)[3] = arr; // 배열 포인터의 선언
printf("%d\n", arr[1][1]); // 배열 이름으로 참조 50
printf("%d\n", arr_p[1][1]); // 배열 포인터로 참조 50
✔ 배열의 이름은 상수라는 점을 제외하면 포인터와 같이 주소를 의미한다.
✔ 배열 포인터는 포인터를 배열처럼 사용하기 위해서 사용하며, 2차원 배열의 이름을 저장할 수 있다.
✔ 따라서 배열 포인터는 1차원 배열에서는 의미가 없으며 2차원 이상의 배열에서만 의미를 가진다.
int (*pa)[4];
pa = &ary[0];
printf("배열 포인터에 ary[0] 주소를 저장, pa[0] 주소 출력 : %p\n",pa[0]);
pa = &ary[1];
printf("배열 포인터에 ary[1] 주소를 저장, pa[0] 주소 출력 : %p\n",pa[0]);
pa = &ary[2];
printf("배열 포인터에 ary[2] 주소를 저장, pa[0] 주소 출력 : %p\n",pa[0]);
✔ 배열 포인터는 2차원 배열의 이름을 저장할 수 있다고 했는데
✔ 더 정확히 말하자면 2차원 배열의 이름뿐만 아니라 2차원 배열의 부분 배열명까지도 저장할 수 있다고 볼 수 있다.
(예) 부분 배열명 arr[0], arr[1], arr[2] / 2차원 배열명은 arr[0]과 같은 주소를 가지므로 사용 가능
✔ 배열 포인터는 저장된 주소를 2차원 배열이 시작되는 위치로 인지하므로 위와 같은 결과가 나온다.
✔ 그리고 첨자를 사용해서 값에 접근하기 위해서 배열 포인터의 크기는 연결할 2차원 배열의 크기보다 작거나 같게 선언한다.
✔ 앞서 정리했던 저장 공간과 값의 형태에 배열 포인터를 추가해서 재정리.
저장 공간 | 저장할 값의 형태 | (예) |
int형 변수 | 정수 | int a = 10, b = 20 ; |
int형 배열 | int형 변수 / 정수 | int arr1[3] = { a, b, 30 } ; |
2차원 int형 배열 | int arr2[2][3] = { 10, 20, 30, 40, 50 60 } ; | |
포인터 변수 | 상수의 주소 | int *p = &arr[1]; |
이중 포인터 변수 | 포인터 변수의 주소 | int **pp = &p; |
포인터 배열 | 포인터 변수 / 주소값 상수 | int *arr_p[3] = { &arr1[0], &arr1[1], &arr1[2]} ; |
배열 포인터 | 2차원 배열명 2차원 배열의 부분 배열명 |
int (*arr_p)[3] = arr2[0] ; |
2차원 배열 요소의 의미
✔ 개념적으로 2차원 배열의 요소는 1차원 배열이지만, 데이터는 1차원 배열의 요소가 저장된다.
✔ 따라서 논리적으로는 2차원 배열의 요소는 1차원 배열이지만, 물리적으로는 1차원 배열의 요소들이다.
int arr[3][4];
✔ 2차원 배열 arr의 논리적 배열 요소의 개수는 3개
✔ 2차원 배열 arr의 물리적 배열 요소의 개수는 12개
[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩 도장 / 위키백과 / TCP School
'BackEnd > C' 카테고리의 다른 글
[21일차] 1. 동적 메모리 할당 함수 (0) | 2021.03.04 |
---|---|
[20일차] 5. 함수 포인터/void 포인터 (0) | 2021.03.03 |
[20일차] 3. 배열 요소의 주소와 배열의 주소 (0) | 2021.03.03 |
[20일차] 2. 이중 포인터의 활용 (0) | 2021.03.03 |
[20일차] 1. 이중 포인터 (0) | 2021.03.03 |