"the only way to be truly satisfied is to do what you believe is great work."

[C언어] 배열을 함수의 인자로 전달하기.

배열의 이름은 int형 포인터다! 
따라서 함수의 인자를 int형 포인터로 선언하면 배열을 함수에 전달할 수 있다.

#include <stdio.h>

void ShowArray(int*param, int len) 
{
	for (int i = 0; i < len; i++) {
		printf("%d ", param[i]);
	}
	printf("\n");
}

int main(void)
{
	int arr1[2] = { 1,2, };
	int arr2[3] = { 3,4,5 };
	ShowArray(arr1, sizeof(arr1) / sizeof(int));
	ShowArray(arr2, sizeof(arr2) / sizeof(int));
	return 0;
}


출력결과 

 

 

 


함수에서 인자로 전달받은 배열의 주소값을 통해, 배열의 값을 직접 수정할수도 있다!

#include <stdio.h>

void ShowArray(int*param, int len) 
{
	for (int i = 0; i < len; i++) {
		printf("%d ", param[i]);
	}
	printf("\n");
}

void Add(int* param, int len) {
	for (int i = 0; i < len; i++) {
		param[i]++;
	}
}

int main(void)
{
	int arr[3] = { 1,2,3 };
	ShowArray(arr, sizeof(arr) / sizeof(int));
	Add(arr, sizeof(arr) / sizeof(int));
	ShowArray(arr, sizeof(arr) / sizeof(int));
	return 0;
}


출력결과

 

 

 

int*param 을 int param[] 과 같이 적어도 완벽히 동일한 선언이다!
단, 매개변수의 선언에서만 유효하다.

#include <stdio.h>

void ShowArray(int param[], int len)
{
	for (int i = 0; i < len; i++) {
		printf("%d ", param[i]);
	}
	printf("\n");
}

void Add(int param[], int len) {
	for (int i = 0; i < len; i++) {
		param[i]++;
	}
}

int main(void)
{
	int arr[3] = { 1,2,3 };
	ShowArray(arr, sizeof(arr) / sizeof(int));
	Add(arr, sizeof(arr) / sizeof(int));
	ShowArray(arr, sizeof(arr) / sizeof(int));
	return 0;
}


출력결과도 완전히 같게 나온다.



[추가]
배열의 길이도 인자로 전달하는 이유는,
인자로 전달받은 arr에 sizeof 함수를 사용하게 되면,
배열의 크기를 반환하는게 아니라 
포인터변수의 크기를 반환하기 때문에 배열의 크기를 알 수 없다.
그래서 배열의 크기를 미리 계산해서 인자로 넘기는 것이다.

#include <stdio.h>

void ShowArray(int *param)
{
	printf("%d ", sizeof(param)/sizeof(int));
}

int main(void)
{
	int arr[3] = { 1,2,3 };
	ShowArray(arr);
	return 0;
}


이런식으로 직접 계산해보면 param의 size는 8byte가 나오는데, 
64비트 아키텍처에서는 포인터의 크기는 8byte이고 32비트 아키텍처에서는 4byte 이다.