반응형
배열을 함수의 인자로 전달하는 방식

배열의 주소 값을 전달하는 방식을 사용한다.

 

밑의 코드처럼 배열을 선언하고 함수의 인자로 배열을 넘깁니다.

그리고 매개변수에는 배열과 같은 자료형인 int형 포인터 변수를 담습니다.

이렇게 포인터 변수를 통해서도 배열의 형태로 접근이 가능합니다!

void Func(int*);

int main()
{
	int arr[3] = {10, 20, 30};
   	Func(arr);
}

void Func(int* pointer)
{
	printf("%d %d %d", pointer[0], pointer[1], pointer[2]);	// 10 20 30 출력
}

 

위의 코드처럼 포인터로 배열을 인자로 받을수 있지만, 아래의 코드처럼 배열을 인자로 전달받을 수 있습니다.

포인터의 선언 int* ptr을 int ptr[]으로 대체할 수는 없습니다.

void Func(int pointer[])
{
	printf("%d %d %d", pointer[0], pointer[1], pointer[2]);	// 10 20 30 출력
}

 

아래의 코드에서 Add함수는 인자로 배열을 받습니다.

배열은 포인터와 호환이 되기에 매개변수로 배열이 넘어갈 수 있습니다.

Add함수는 그 배열의 원소에 add변수를 더해주는 함수입니다.

참조값이기에 main함수의 배열의 원소에도 이 더해진 값이 적용이 됩니다.

 

그렇다면 인자로 길이를 넘겨받는 이유는 뭘까요?

인자로 받지 않는 대신에 Add함수에서 sizeof(param) / sizeof(int)로

길이를 구할 수 있지 않을까? 생각할 수도 있습니다.

 

하지만 그 결과는 다릅니다.

포인터변수를 sizeof연산자로 값을 구하면

해당 변수의 타입에 대한 크기가 나오는게 아니라

포인터 변수 의 크기가 나오게 됩니다.

포인터 변수의 크기는 시스템의 주소값 크기에 따라 다릅니다.

즉 int형 포인터 변수여도 시스템의 주소값 크기가 나온다는 뜻입니다.

 

그래서 인자로 넘겨받은 param에 sizeof연산자를 붙이면 우리가 기대한

int형 타입의 크기인 4byte가 아닌 시스템의 주소값 크기가 나오게 됩니다.

즉, main함수에서 길이를 구하고 인자로 넘겨주는 방법밖에 없습니다!

// 매개변수로 넘어온 배열의 값에 변수add를 더해주는 함수
void Add(int * param, int len, int add)
{
	for(int i = 0; i < len; i++);
    	param[i] += add;
}

int main()
{
    int arr[3] = {1,2,3};
    Add(arr, sizeof(arr) / sizeof(int), 1);
    for(int i = 0; i < len; i++)
    {
    	printf("%d ", arr[i]);	// 2 3 4 출력
    }
}

 

 

반응형

 

반응형

'C' 카테고리의 다른 글

포인터 대상의 const 선언  (0) 2023.05.15
Call by value와 Call by reference의 차이점  (0) 2023.05.15
포인터 배열  (0) 2023.05.15
포인터 연산  (0) 2023.05.15
포인터와 배열의 관계  (0) 2023.05.15

+ Recent posts