배열과 포인터는 C++에서 밀접하게 관련된 개념입니다. 배열이 포인터로 변환되는 decay
과정과 그로 인한 차이점을 이해하는 것은 매우 중요합니다. 이번 포스트에서는 배열과 포인터의 관계를 다양한 예제를 통해 살펴보겠습니다.
배열은 연속된 메모리 공간에 데이터를 저장하며, 배열의 이름은 배열의 첫 번째 요소를 가리키는 포인터로 해석됩니다.
#include <iostream>
using namespace std;
int main()
{
// 배열의 선언과 기본 출력
{
int nums[] = { 1, 2, 3 }; // 정수형 배열 nums를 선언하고 초기화
cout << nums << endl; // 배열의 주소 출력
int* pNums = nums; // 배열의 첫 번째 요소의 주소를 포인터 pNums에 저장 (배열이 포인터로 decay)
cout << sizeof(nums) << endl; // 배열의 크기 출력 (12바이트, 4바이트 * 3)
cout << sizeof(pNums) << endl; // 포인터의 크기 출력 (보통 8바이트)
// 배열과 포인터의 주소 출력
cout << nums << endl; // 배열의 첫 번째 요소 주소 출력
cout << &nums << endl; // 배열의 주소 출력 (타입이 다름)
cout << &nums[0] << endl; // 배열의 첫 번째 요소 주소 출력
cout << endl;
// 타입 정보 출력
cout << typeid(1).name() << endl; // int
cout << typeid(nums).name() << endl; // int [3]
cout << typeid(&nums).name() << endl; // int (*)[3]
cout << typeid(&nums[0]).name() << endl;// int*
}
return 0;
}
위 코드에서는 배열 nums
가 포인터 pNums
로 변환되는 과정을 보여줍니다. sizeof
를 사용하여 배열과 포인터의 크기를 비교하고, typeid
를 사용하여 타입 정보를 확인할 수 있습니다.
포인터를 이용하여 배열 요소에 접근할 수 있습니다. 배열의 이름은 배열의 첫 번째 요소를 가리키는 포인터로 사용됩니다.
#include <iostream>
using namespace std;
int main()
{
{
int nums[] = { 1, 2, 3 }; // 정수형 배열 nums를 선언하고 초기화
int* pNums = nums; // 배열의 첫 번째 요소의 주소를 포인터 pNums에 저장
// 포인터를 이용하여 배열 요소 접근
cout << pNums[0] << endl; // 1
cout << pNums[1] << endl; // 2
cout << pNums[2] << endl; // 3
// 포인터의 주소 출력
cout << pNums << endl; // base address + sizeof(int) * 0
cout << pNums + 1 << endl; // base address + sizeof(int) * 1
cout << pNums + 2 << endl; // base address + sizeof(int) * 2
// 포인터를 이용한 역참조
cout << *pNums << endl; // nums[0]
cout << *(pNums + 1) << endl; // nums[1]
cout << *(pNums + 2) << endl; // nums[2]
}
return 0;
}
위 코드에서는 포인터를 이용하여 배열 요소를 접근하는 방법을 보여줍니다. 포인터의 인덱스 접근과 역참조를 통해 배열 요소에 접근할 수 있습니다.
포인터 연산을 통해 배열 요소를 순회할 수 있습니다. 포인터를 증가시키면 다음 배열 요소를 가리키게 됩니다.
#include <iostream>
using namespace std;
int main()
{
{
int nums[] = { 1, 2, 3 }; // 정수형 배열 nums를 선언하고 초기화
int* pNums = nums; // 배열의 첫 번째 요소의 주소를 포인터 pNums에 저장
cout << *pNums << endl; // nums[0]
pNums++; // 포인터를 다음 요소로 이동
cout << *pNums << endl; // nums[1]
}
return 0;
}
위 코드에서는 포인터 연산을 통해 배열 요소를 순차적으로 접근하는 방법을 보여줍니다. 포인터를 증가시키면 다음 배열 요소를 가리키게 됩니다.
포인터와 배열은 C++에서 매우 밀접한 관계를 가지고 있습니다. 배열의 이름은 배열의 첫 번째 요소를 가리키는 포인터로 사용되며, 포인터를 이용하여 배열 요소에 접근하거나 순회할 수 있습니다. 포인터와 배열의 관계를 이해하면 메모리 관리와 데이터 구조를 더욱 효율적으로 다룰 수 있습니다. 이번 포스트에서는 포인터와 배열의 기본 개념과 사용법을 다양한 예제를 통해 살펴보았습니다. 반복해서 연습하고 실습해보세요!