포인터와 정적배열을 알아야 하는 것은 포인터의 성질에 대해 아는 것과 같다. 동적배열을 이해하기 위해 알아야 한다. 즉, 포인터와 배열이 무슨 관계가 있는지에 대해 설명한다.
결론부터 말하자면, 포인터와 배열은 서로 같다!
정적배열이란 우리가 만들어주는 배열이라고 생각하면 된다. 즉, int array[5] = {9, 7, 5, 3, 1};
처럼 user가 만들어주는 배열!
#include <iostream>
using namespace std;
int main()
{
int array[5] = { 9, 7, 5, 3, 1 };
cout << array[0] << endl;
cout << array << endl;
return 0;
}
output : 9
00F6FDA4
cout
을 사용하여 array
를 출력했는데 값이 나오지 않고 주소가 나오는 것을 알 수 있다.
#include <iostream>
using namespace std;
int main()
{
int array[5] = { 9, 7, 5, 3, 1 };
cout << array[0] << endl;
cout << array << endl;
cout << &(array[0]) << endl;
cout << *array << endl;
int *ptr = array;
cout << ptr << endl;
cout << *ptr << endl;
cout << &ptr << endl;
/*char name[] = "junwoo";
cout << *name << endl;*/
return 0;
}
output : 9
00B3F99C
00B3F99C
9
00B3F99C
9
00B3F990
이를 제대로 이해하는 것이 중요하다. array
를 담은 포인터 변수 ptr
의 직접 주소를 찍어보면 array
의 주소와 다르다는 것을 제대로 이해하고 넘어가야 한다. 이번이 이해가 가지 않으면 바로 전에 했던 포인터에 대한 내용을 다시 한번 읽고 오길 바란다.
#include <iostream>
using namespace std;
int main()
{
int array[5] = { 9, 7, 5, 3, 1 };
cout << sizeof(array) << endl;
int *ptr = array;
cout << sizeof(ptr) << endl;
return 0;
}
output : 20
4
전 블로그에도 썼다시피 위의 코드에 대한 내용도 이해가 가지 않는다면 포인터에 대해 다시한번 보고오자. 왜 output
이 저렇게 나오는지에 대해 이해하자.
#include <iostream>
using namespace std;
void printArray(int array[]) // void printArray(int *array)
{
cout << sizeof(array) << endl;
cout << *array << endl;
}
int main()
{
int array[5] = { 9, 7, 5, 3, 1 };
cout << sizeof(array) << endl;
int *ptr = array;
cout << sizeof(ptr) << endl;
printArray(array);
return 0;
}
output : 20
4
4
9
왜 이렇게 나오는가? 함수의 매개변수로 배열을 사용하게 되면 포인터와 같이 동작하여 출력은 4 byte
로 나오게 되는 것이다. 또한 , void printArray(int array[])
와 void printArray(int *array)
는 동일한 동작을 한다.
#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 array[5] = { 9, 7, 5, 3, 1 };
cout << sizeof(array) << endl;
int *ptr = array;
cout << sizeof(ptr) << endl;
printArray(array);
cout << array[0] << " " << *array << endl;
return 0;
}
output : 20
4
4
9
100 100
옹? 뭔가 이상하지 않은가? 원래 함수 scope 밖으로 나가게 되면 저장한 정보는 소실되어 100
은 저장되지 않고 사라져야 하는데, 왜 100
이 출력된다. 이는 C언어에서 많이 사용됬었는데, 함수에서 정보를 저장하고 갖고 올때 사용하는 경우로 많이 사용되었다. C++에서는 참조 형식으로 많이 사용하는데, 이는 나중에 다시 한번 말해주겠다.