[열혈C프로그래밍] chapter 12. 포인터와 함수

chapter 12

포인터와 함수

함수의 인자로 배열 전달하기

함수에서 배열이 전달되는 방법
=> 배열의 주소값을 전달한다 .즉 매개변수에게 배열의 이름에 저장된 값을 전달한다.

void SimpeFunc(int* param){....}

int main(void){

  int num[2]={1,2};

  SimpleFunc(num); //배열의 주소값을 매개변수(param)로 전달. // int* param = num; 이런 꼴이다. 

  return 0;
}
★개꿀팁
함수 내에서는 인자로 전달된 배열의 길이를 알 수 없다. ```c void simpleFunc(int *arr){

int sz = sizeof(arr); // sizeof(arr)는 포인터 변수 arr의 크기를 나타주지 전달된 배열의 길이를 나타낼수 없다. // 애초에 배열이 전송된게 아니라 배열의 주소값을 주었으므로 배열의 길이를 알수 있을리가 없다. printf(“sz:%d \n”,sz);// 현재 이 컴퓨터의 cpu가 64비트 주소 체계이므로 답은 8. }

int main(void){

int arr[] = {1,2,3,4,5};

printf(“arr:%d \n”,sizeof(arr)/sizeof(int));//5 simpleFunc(arr);

return 0; }

=> 따라서 다른 함수에서 배열의 길이값을 사용하려면 따로 len값을 매개변수로 전달해야한다.(중요!) <br>

### Call-by-value vs Call-by-reference

* 값을 전달하는 형태의 함수호출: Call-by-value

```c 
# include <stdio.h>

void swap(int num1, int num2){
   int temp = num1;
   num1 = num2;
   num2 = temp;

}

int main(void){

  int num1=2, num2=4;
 
  printf("before main의 num1,num2: %d %d \n", num1,num2);
  swap(num1,num2); //변수값만 매개변수에 전달하여 복사시키는 call-by-value는 swap 할 수 없다.
  printf("after main의 num1,num2: %d %d \n", num1,num2); // not change.
  return 0;
}

# include <stdio.h>

void swap(int* ptr1, int* ptr2){
  
  int temp = *ptr1;
  *ptr1 = *ptr2;
  *ptr2 = temp;

}


int main(void){

  int num1=2;
  int num2=4;

  printf("before swap: %d %d \n",num1,num2);
  swap(&num1,&num2); //주소값을 매개변수에게 전달하는 Call-by-reference 이기에 swap이 된다. 
  printf("after swap: %d %d \n",num1,num2); 
  


  return 0;
}

int scanf(const *char …);
=> scanf도 함수이고 따라서 값의 저장을 위해선 주소값을 전달해야한다. 따라서 변수의 주소값을 반환하는 &연산자를 사용하는 것이다.

포인터 대상의 const 선언

const int* ptr = &num; // 포인터 변수가 참조하는 대상의 변경을 허용하지 않는 const 선언
// => 포인터 변수를 통한 변수값 변경 x , 그냥 변수를 통한 변수값 변경 o

int* const ptr = &num; //  포인터 변수의 상수화
// => 포인터 변수가 다른 주소값을 참조 불가능. 배열의 이름과 같다. 

const int* const ptr = &num ; // 포인터 변수가 참조하는 변수 값 변경 x , 포인터 변수 값 변경 x

(중요) const 선언을 하는 이유
개발자의 실수로 중요한 값을 바뀌는 사고를 미연에 방지하기 위해 const 선언을 통해 상수화 한다.
```c

include

int main(void){

const double PI = 3.14; double rad; //반지름 double result;

PI=3; //PI는 상수이기때문에 값을 바꿀수 없다(read-only variable). 따라서 컴파일 에러가 난다.

scanf(“%lf”, &rad); result = radradPI; printf(“circle area: %f \n”, result);

return 0;

}

```