반응형
포인터와 정적 배열의 관계
포인터와 정적 배열의 관계를 이해하는 것은 이후 메모리 동적할당, 동적배열 등을 이해할 때
중요한 기본이 된다. 배열은 포인터로 다 접근할 수 있고 포인터와 배열은 같다.
#include <iostream>
using namespace std;
int main()
{
int arr[5] = { 4, 3, 1, 5, 6 };
cout << arr[0] << endl; // 4
cout << arr << endl; // 0x16fa7b1f0
cout << &arr[0] << endl; // 0x16fa7b1f0
cout << *arr << endl; // 4
return 0;
}
배열이 함수의 parameter로 들어오는 경우 주의해야 할 경우가 있다.
#include <iostream>
using namespace std;
// void printArray(int * array)
void printArray(int array[])
{
cout << sizeof(array) << endl;
cout << *array << endl;
*array = 100;
}
int main()
{
int arr[5] = { 4, 3, 1, 5, 6 };
cout << arr[0] << endl; // 4
cout << arr << endl; // 0x16fa7b1f0
cout << &arr[0] << endl; // 0x16fa7b1f0
cout << *arr << endl; // 4
cout << sizeof(arr) << endl; // 20
printArray(arr); // 8
cout << *arr << endl; // 100
return 0;
}
sizeof(arr)를 main에서 찍어봤을땐 20이 나오는데, printArray 함수 내부에서 출력했을땐 8이 나왔다.
굳이 포인터를 parameter로 쓰지않고 array로 보냈는데, array처럼 보이지만 내부적으로 그냥 포인터라는 것이다.
또한 printArray 함수에서 de-referencing한 array를 100으로 바꾸면 함수 밖에서도 값을 변경할 수 있다는 것도 포인터의 중요한 성질이다.
문법상으로 정적 배열을 포인터와 똑같이 사용하기보다 좀더 편하게 정적 배열 답게 쓸수 있도록 도와주는 장치가 있다.
#include <iostream>
using namespace std;
struct Mystruct
{
int array[5] = { 1, 2, 3, 4, 5 };
};
void printSize(Mystruct *ms)
{
cout << sizeof((*ms).array) << endl;
}
int main()
{
Mystruct ms;
cout << sizeof(ms.array) << endl; // 20
printSize(&ms); // 20
return 0;
}
결론은 함수의 파라미터로 정적 배열을 넣었을 경우에는 포인터로 강제 변환이 되어 배열로써 사용할수 없고,
배열이 구조체나 class 안에 들어있는 경우에는 포인터로 강제 변환이 되지 않는다.
반응형
'C++' 카테고리의 다른 글
6-5. 문자열 스타일의 심볼릭 상수 (기호적 상수) (1) | 2024.02.20 |
---|---|
6-4. 포인터 연산, 배열 인덱싱 (0) | 2024.02.20 |
6-2. 포인터의 기본적인 사용법, 널 포인터 (0) | 2024.02.18 |
6-1. C언어 스타일 배열 문자열(strcpy, strcat, strcmp) (0) | 2024.02.17 |
5-3. C++ std::cin.fail(), std::cin.clear(), std::cin.ignore() 함수 (0) | 2024.02.07 |