Review:매개변수로서의 배열

Icarus<Wing>·2022년 10월 9일
0

지난시간에 우리는 call by address를 swap함수를 통해 이해하였다. 이번에는 배열이 포인터라는 점을 이용해서 매개변수에 전달된 배열은 포인터라는 것을 알아보자.

매개변수로서의 배열

#include <iostream>

using namespace std;

void func(int a[], int n)//또는 int*a, 
{
	int i;
	for (i = 0; i < n; i++)
		cout << a[i] << endl;
	
}

int main()
{
	int A[5] = { 2,4,6,8,10};
	func(A, 5);

	return 0;
}

  • 배열은 곧 포인터이므로, func인자에 있는 A는 배열의 주소라 할 수 있다

  • func의 매개변수에 전달된 int a[]는 사실상 포인터다. 왜냐하면 swap함수에서 봤듯이, 포인터는 변수의 주소를 저장하기 때문이다.(int *a로 선언해도 동일)

  • 인자의 5는 매개변수의 n에 복사된다

    그래서 []안에 0보다 큰 어떠한 값을 넣어도 포인터처럼 동작한다

  • call by address에 의해 func함수내에서 배열의 값을 변경하면 main함수에서도 그대로 적용이 된다. a[i] = i; cout<<a[i]<<endl;로 하면 0,1,2,3,4가 순서대로 출력된다.

동적으로 할당된 배열

#include <iostream>

using namespace std;

int * func(int n)
{
	int* p;
	p = (int*)malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++)
	{
		p[i] = i;
		cout << p[i] << endl;
	}
	free(p);

	return p;
}

int main()
{
	int* A;
	A = func(5);
	
	return 0;
}

그림으로 표현한 코드 과정

  • 포인터 A는 func을 가리킴 -> 그런데 func함수 내의 int* p는 n만큼 int형 메모리를 동적으로 할당한 다음 포인터 p를 반환하고 func의 스택프레임은 파괴됨
    -> p는 동적으로 할당된 배열을 가리키므로, 결과적으로 A는 p가 가리키는 주소인 배열을 가리킨다.
profile
모든 코드에는 이유가 있기에 원인을 파악할 때까지 집요하게 탐구하는 것을 좋아합니다.

0개의 댓글