14장. 포인터와 함수에 대한 이해
14-1 함수의 인자로 배열 전달하기 기본적인 인자의 전달 방식 값의 복사에 의한 전달 그림 14-1
14-1 함수의 인자로 배열 전달하기 배열의 함수 인자 전달 방식 배열 이름(배열 주소, 포인터)에 의한 전달 그림 14-2 14-1 함수의 인자로 배열 전달하기 배열의 함수 인자 전달 방식 배열 이름(배열 주소, 포인터)에 의한 전달 #include <stdio.h> void fct(int *arr2); int main(void) { int arr1[2]={1, 2}; fct(arr1); printf("%d \n", arr1[0]); return 0; } void fct(int *arr2) printf("%d \n", arr2[0]); arr2[0]=3; } 그림 14-2 그림 14-3
14-1 함수의 인자로 배열 전달하기 배열 이름, 포인터의 sizeof 연산 14-1 함수의 인자로 배열 전달하기 배열 이름, 포인터의 sizeof 연산 배열 이름 : 배열 전체 크기를 바이트 단위로 반환 포인터 : 포인터의 크기(4)를 바이트 단위로 반환 arr_adder.c 참조 #include <stdio.h> int main(void) { int arr[5]; int* pArr=arr; printf(“%d \n”, sizeof(arr) ); // 20 출력 printf(“%d \n”, sizeof(pArr) ); // 4 출력 return 0; }
14-1 함수의 인자로 배열 전달하기 "int * pArr" vs. "int pArr[ ]" 둘 다 같은 의미를 지닌다. 14-1 함수의 인자로 배열 전달하기 "int * pArr" vs. "int pArr[ ]" 둘 다 같은 의미를 지닌다. 선언 "int pArr[ ]"은 함수의 매개 변수 선언 시에만 사용 가능 max_fct.c 참조 int function(int pArr[]) { int a=10; pArr=&a; // pArr이 다른 값을 지니게 되는 순간 return *pArr; }
14-2 Call-By-Value와 Call-By-Reference 값의 복사에 의한 함수의 호출 가장 일반적인 함수 호출 형태 #include <stdio.h> int add(int a, int b); int main(void) { int val1=10; int val2=20; printf(" 결 과 : ", add(val1, val2); return 0; } int add(int a, int b) return a+b; }
14-2 Call-By-Value와 Call-By-Reference Call-By-Value에 의한 swap int main(void) { int val1=10; int val2=20; swap(val1, val2); printf("val1 : %d \n", val1); printf("val2 : %d \n", val2); return 0; } void swap(int a, int b) int temp=a; a=b; b=temp; printf("a : %d \n", a); printf("b : %d \n", b); } 그림 14-5
14-2 Call-By-Value와 Call-By-Reference 참조(참조를 가능케 하는 주소 값)를 인자로 전달하는 형태의 함수 호출 그림 14-6
14-2 Call-By-Value와 Call-By-Reference Call-By-Reference에 의한 swap int main(void) { int val1=10; int val2=20; printf("Before val1 : %d \n", val1); printf("Before val2 : %d \n", val2); swap(&val1, &val2); //val1, val2 주소 전달 printf("After val1 : %d \n", val1); printf("After val2 : %d \n", val2); return 0; } void swap(int* a, int* b) int temp=*a; *a=*b; *b=temp; } 그림 14-7
14-2 Call-By-Value와 Call-By-Reference scanf 함수 호출 시 &를 붙이는 이유 case 1 case 2 int main(void) { int val; scanf("%d", &val); . . . . . int main(void) { char str[100]; printf("문자열 입력 : "); scanf("%s", str); . . . . .
14-3 포인터와 const 키워드 포인터가 가리키는 변수의 상수화 포인터 상수화 그림 14-8 그림 14-9 int a = 10; const int * p = &a; *p=30 // Error! a=30 // OK! 그림 14-8 int a=10; int b=20; int * const p = &a; p=&b // Error! *p=30 // OK! 그림 14-9
14-3 포인터와 const 키워드 const 키워드를 사용하는 이유 컴파일 시 잘못된 연산에 대한 에러 메시지 프로그램을 안정적으로 구성 #include <stdio.h> float PI=3.14; int main(void) { float rad; PI=3.07; // 분명히 실수!! scanf("%f", &rad); printf("원의 넓이는 %f \n", rad*rad*PI); return 0; } #include <stdio.h> const float PI=3.14; int main(void) { float rad; PI=3.07; // Compile Error 발생! scanf("%f", &rad); printf("원의 넓이는 %f \n", rad*rad*PI); return 0; }