2010. 7. 10. 02:12
제 23장 포인터와 함수에 대한 이해 - 1


call by Reference
call by Value 

이번장은 저 위에 두가지 개념을 확실히 이해합시다!


함수의 인자로 전달하기

 - 값의 복사에 의한 전달 예)

void Fuction(int a) // val의 값을 변수 a에 복사
{
a++;
return a;
}

int main(void)
{
int val = 10; 
val = Function(val); // val이 지니고 있는 값을 전달하는것이다.
return 0;
}                                  // 변수 val, a는 다름(별개의 것)



배열의 인자로 전달하기
 // 배열전체 복사할수 없다(불가능)

 - 배열의 주소값을 전달한다!!

 - 값의 복사에 의한 전달 예제)

예제)=============================================================   


#include <stdio.h>

void Function(int* New_Array);

int main()
{
int Array[5] = {0, 1, 2, 3, 4};        // index값이 5인 배열 Array 선언
int i;

printf("Array배열의 요소 : ");

for(i=0; i<5; i++)
printf("%d ", *(Array + i)); // Array배열을 순서대로 출력

Function(Array);          // Function 함수호출(인자값은 Array의 주소로)
printf("\n배열요소값을 변경후 : ");// Array의 이름자체가 주소라고 인식을 하고 넘어가요

for(i=0; i<5; i++)         // 다시 Array배열 순서대로 출력
printf("%d ", *(Array + i));

printf("\n");

return 0;
}

void Function(int* New_Array) // main함수에서의 Array의 주소값을 받는다.
{           // 배열의 형태도 가리키는 포인터 형태이므로 
int j;          // int* 형식으로 주소값을 받는다!
int temp;

for(j=0; j<3; j++)
{
temp = *(New_Array+j); // 임시변수로 값자체를 바꾼다.
*(New_Array+j) = *(New_Array+4-j);// tip) : *(A+i) == A[i]
*(New_Array+4-j) = temp;
}
}

// Array값의 변경을 Function 함수에서 변경한셈이다.

// 즉, Function 함수가 int*형(int Array[])을 받기 때문에 똑같이 int*형을 선언한뒤
// Array의 주소값을 받는 셈 
// 배열전체자체를 받는건 불가능하다

=================================================================   

배열이름, 포인터 sizeof 연산 

 - 배열이름 : 배열 전체크기를 바이트 단위로 넘김

 - 포인터 : 포인터의 크기(4)를 바이트 단위로 넘김

예제)=============================================================   


#include <stdio.h>

int Sum_Array(int* N_Array, int index);

int main()
{
int Array[8] = {1, 2, 3, 4, 5, 6, 7 , 8};
int Serve_Sum;
printf("index of Array = %d \n", sizeof(Array)/sizeof(int));
Serve_Sum = Sum_Array(Array, sizeof(Array)/sizeof(int));
printf("Sum of Array's factors : %d \n", Serve_Sum);

return 0;
}
// sizeof연산을 이용한 논리적인 인자전달을 한다면
// 코드의 변화시 수정해줄 요소가 적어진다.
// 어떠한 환경에 변화에 따라서 프로그램이 유연하게 동작하도록
// 코딩을 하는것이 최선이다
// int대신 4를 넣어도 되지만, 시스템에 따라서 int는 2, 4, 8 이 인식되기때문에
// sizeof(int)라고 인자전달을 하게 코딩한것임

int Sum_Array(int* N_Array, int index)
{
int i, sum=0;

for(i=0; i<index; i++) // i<index ==> i< sizeof(N_Array) (4가 리턴될뿐)
sum += *(N_Array+i); // sum += N_Array[i]

return sum;
}

=================================================================   


"int * Array" vs "int Array[]"

 - 둘다 같은 의미를 지닌다.

 - int Array[]은 배열보다는 포인터에 가깝다.

 - 매개변수 안에서는 저렇게 사용이 가능 : Array[];(하지만 자제하시오)
 
 - 배열과 포인터 혼돈을 피하기위해서는 int* Array 형태가 더 좋다


Posted by 토실토실천재