(C++) 6.7 포인터와 정적배열

이준우·2021년 10월 19일
0

포인터와 정적배열을 알아야 하는 것은 포인터의 성질에 대해 아는 것과 같다. 동적배열을 이해하기 위해 알아야 한다. 즉, 포인터와 배열이 무슨 관계가 있는지에 대해 설명한다.

결론부터 말하자면, 포인터와 배열은 서로 같다!

정적배열이란 우리가 만들어주는 배열이라고 생각하면 된다. 즉, 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++에서는 참조 형식으로 많이 사용하는데, 이는 나중에 다시 한번 말해주겠다.

profile
꿈꾸는 CV

0개의 댓글