2010. 7. 10. 02:14

 

제 24장 포인터와 함수에 대한 이해 - 2

 

 


Call by Value (call : 함수를 호출한다)

 

 - 값의 복사에 의한 함수 호출
 
 - 가장 일반적인 함수 호출 형태

 

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

 

#include <stdio.h>

int Add(int num1, int num2); // 더하기 함수 선언

int main()
{
 int val1 = 100;
 int val2 = 200;
 
 printf("더하기값(Add 함수값) : %d \n", Add(val1, val2));

 return 0;
}

int Add(int num1, int num2) // 더하기 함수 정의
{
 return num1 + num2;
}

// main 함수내의 val1, val2값을
// Add함수에 매개변수에 복사한다는 의미

 

 

 

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


#include <stdio.h>

 

void swap(int a, int b);


int main(void)
{
 int number_1 = 10;
 int number_2 = 300;

 printf("number_1 = %d \n", number_1);
 printf("number_2 = %d \n", number_2);

 swap(number_1, number_2);

 return 0;
}

 

void swap(int a, int b)
{
 int temp;

 temp = a;
 a = b;
 b = temp;

 printf("a = %d \n", a);
 printf("b = %d \n", b);

}


// val1, val2의 값이 그대로 복사해서 Add함수의 num1, num2에 전달된다.
// 즉, val1, val2와 num1, num2는 별개의 변수다



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

 

call by Reference 
 
 - 참조(참조를 가능케 하는 주소값)를 인자로 전달하는  형태의 함수호출

 

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

 

#include <stdio.h>

 

void P_add(int* p)      // main함수의 number의 주소값을 인자로 받는다
{
 (*p)++;                     // p는 main함수의 number을 가리키므로 number값이 1증가한다.
}

int main()
{
 int number = 100; 

 P_add(&number);      // number의 주소값을 넘긴다.

 printf("number = %d \n", number);

 return 0;
}

 

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

 

 

scanf 함수 호출시 &를 붙이는 이유?

 

 - scanf("%d", &val);
   // scanf함수가 val이라는 변수에 접근하기 위해서
   // 주소값을 찾아서 실행된다.(call by reference)

 - scanf("%s", str);
   // 배열이름이 주소값이며, 포인터이름 자체가 주소값 str 이기때문에
   // &를 붙일 필요가 없다.

 

 


포인터가 가리키는 변수의 상수화

 - int a = 20;
   const int* p = &a;
   *p = 10; // Error
   a = 30;  // ok!;
 // p가 a를 봤을때만! a는 상수다
 // p라는 포인터로 a값을 변경 불가능하다!

 

 

 

포인터 상수화

 - int a = 20;
   int b = 100;
   int* const  p = &a;
   p = &b;   // Error
   *p = 30;  // ok!;
// p라는 포인터가 가리키는 값 자체를 상수화
// p는 무조건! 항상 a만 가리킬수 있음.

 - const int* const p = &a 이경우는
   위의 두가지 특징을 다 가진다.
  > p는 무조건 a만 가리키고 p를 통해서 a값을 변강할수 없다.

 

 


const 키워드를 사용하는 이유

 

 - 컴파일시 잘못된 연산에 대한 에러메시지
 
 - 프로그램을 안정적으로 구성

 

 

 

Posted by 토실토실천재