참고:ptr과 ptr + 1 사이의 주소 차이는 4바이트입니다. ptr이 int 데이터를 가리키는 포인터이기 때문입니다. 64비트 운영체제에서 int의 크기는 4바이트입니다.
마찬가지로 포인터 ptr이 char 타입 데이터를 가리킨다면 ptr과 ptr + 1 사이의 주소 차이는 1바이트입니다. 문자의 크기가 1바이트이기 때문입니다.
예제 1: C++ 포인터와 배열
// 배열 각 요소의 주소를 출력하는 C++ 프로그램
#include <iostream>
using namespace std;
int main() {
float arr[3];
// 포인터 변수 선언
float *ptr;
cout << "배열을 사용한 주소 출력: " << endl;
// for 루프로 모든 배열 요소의 주소 출력
for (int i = 0; i < 3; ++i) {
cout << "&arr[" << i << "] = " << &arr[i] << endl;
}
// ptr = &arr[0]
ptr = arr;
cout << "\n포인터를 사용한 주소 출력: " << endl;
// 포인터 표기법으로 모든 배열 요소의 주소 출력
for (int i = 0; i < 3; ++i) {
cout << "ptr + " << i << " = " << ptr + i << endl;
}
return 0;
}
출력
배열을 사용한 주소 출력:
&arr[0] = 0x61fef0
&arr[1] = 0x61fef4
&arr[2] = 0x61fef8
포인터를 사용한 주소 출력:
ptr + 0 = 0x61fef0
ptr + 1 = 0x61fef4
ptr + 2 = 0x61fef8
위 프로그램에서 먼저 포인터 변수 ptr을 사용하지 않고 배열 요소들의 주소를 단순히 출력했습니다.
그런 다음 포인터 ptr을 사용해 a[0]의 주소를 가리키고, ptr + 1로 a[1]의 주소를, 이런 식으로 가리켰습니다.
대부분의 문맥에서 배열 이름은 포인터로 변환됩니다. 간단히 말해 배열 이름은 포인터로 변환됩니다. 그래서 포인터를 사용해 배열 요소에 접근할 수 있는 것입니다.
하지만 포인터와 배열은 같지 않다는 점을 기억해야 합니다.
배열 이름이 포인터로 변환되지 않는 몇 가지 경우가 있습니다. 자세한 내용은 '배열 이름이 포인터로 변환되지 않는 경우는?'을 참조하세요.
예제 2: 배열 이름을 포인터로 사용하기
// 포인터 표기법을 사용해 데이터를 입력받고 출력하는 C++ 프로그램
#include <iostream>
using namespace std;
int main() {
float arr[5];
// 포인터 표기법으로 데이터 입력
cout << "5개의 숫자 입력: ";
for (int i = 0; i < 5; ++i) {
// 입력받은 숫자를 arr[i]에 저장
cin >> *(arr + i);
}
// 포인터 표기법으로 데이터 출력
cout << "데이터 출력: " << endl;
for (int i = 0; i < 5; ++i) {
// arr[i] 값 출력
cout << *(arr + i) << endl;
}
return 0;
}
출력
5개의 숫자 입력: 2.5 3.5 4.5 5 2
데이터 출력:
2.5
3.5
4.5
5
2
여기서
먼저 포인터 표기법을 사용해 사용자가 입력한 숫자를 배열 arr에 저장했습니다.
cin >> *(arr + i);
이 코드는 아래 코드와 동일합니다:
cin >> arr[i];
별도의 포인터 변수를 선언하지 않고 배열 이름 arr을 포인터 표기법으로 사용했음을 알 수 있습니다.
이미 아는 바와 같이 배열 이름 arr은 배열의 첫 번째 요소를 가리킵니다. 따라서 arr을 포인터처럼 취급할 수 있습니다.