C/C++ 를 쓸때마다 항상 헷갈리는 단어가 존재한다.
바로 "포인터 배열"과 "배열 포인터" 이다.
그럼 두 단어가 의미하는바가 어떤식으로 다른지 알아보자.
1. 포인터 배열 (Pointer Array)
포인터 배열은 말 그대로 "포인터의 배열"을 의미한다.
배열이란 단일 식별자를 통해 같은 자료형의 여러 변수에 접근할 수 있게 해주는 집계 데이터유형 이다.
즉, 같은 자료형의 변수를 일렬로 늘어놓은 형태라고 생각하면 된다.
포인터 배열은 변수 자체가 포인터를 의미하므로
포인터 변수를 일렬로 늘어놓은 데이터 유형이라고 생각하면 된다.
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 20;
int c = 30;
int *ptr_array[3] = {&a, &b, &c};
for (int i = 0; i < 3; i++) {
cout << "addr : " << ptr_array[i] << " value : " << *ptr_array[i] << endl;
}
}
3개짜리의 포인터 배열을 선언 한 후 각 배열 인덱스에
포인터 값을 넣은 예제이다.
아래의 각 배열의 주소값의 증가율을 보면 4byte 씩 차이나는 것을 볼 수 있다.
왜 4바이트씩 차이나는지 궁금하다면 아래의 그림을 참고하길 바란다.
ptr_array[i] 내에는 결국 데이터의 주소 즉 포인터 값이 들어있을 것이다.
현재 테스트하는 컴퓨터 환경은 64비트 환경이므로 정수형의 크기가 4byte이다.
즉, ptr_array[0], ptr_array[1], ptr_array[2] 의 시작값이 4씩 차이나는 것이 합당하다.
즉, 위의 그림에서 ptr_array 에 들어있는 값은
데이터값이 아닌 포인터 값임을 알 수 있다.
2. 배열 포인터(Array Pointer)
배열 포인터는 말 그대로 "배열을 가리키는 포인터" 라고 생각하면 된다.
아래와 같이 배열포인터를 선언하고 메모리 내부를 상상해보자.
#include <iostream>
using namespace std;
int main()
{
int arr[3] = {10, 20, 30};
int (*arr_ptr)[3] = &arr;
}
또한 배열포인터를 사용해서,
배열 인덱스에 접근하여 값을 가져오는 방법은 아래와 같다.
#include <iostream>
using namespace std;
int main()
{
int arr[3] = {10, 20, 30};
int (*arr_ptr)[3] = &arr;
//배열 포인터를 통해서 각 배열 값에 접근하는 방법 1
for (int i = 0; i < 3; i++) {
cout << *(*arr_ptr + i) << endl;
}
//배열 포인터를 통해서 각 배열 값에 접근하는 방법 2
for (int i = 0; i < 3; i++) {
cout << (*arr_ptr)[i] << endl;
}
}
'C,C++' 카테고리의 다른 글
[C++] Mysql select, insert, update, delete (0) | 2023.08.16 |
---|---|
[C++] 멀티스레드 프로그래밍 (0) | 2023.08.15 |
[C++] Mac os 에서 Mysql 연결하기 (0) | 2023.08.14 |
[C/C++] 포인터 (0) | 2022.06.02 |