C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과
14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2
14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include <stdio.h> void fct(int *arr2); int arr1[2]=1, 2; fct(arr1); printf("%d \n", arr1[0]); void fct(int *arr2) printf("%d \n", arr2[0]); arr2[0]=3; Department of Computer Engineering 3
14-1 함수의인자로배열전달 배열이름, 포인터의 sizeof 연산 배열이름 : 배열전체크기를바이트단위로반환 포인터 : 포인터의크기 (4) 를바이트단위로반환 #include <stdio.h> int arr[5]; int* parr=arr; printf( %d \n, sizeof(arr) ); printf( %d \n, sizeof(parr) ); Department of Computer Engineering 4
14-1 함수의인자로배열전달 #include <stdio.h> int ArrAdder(int *, int); int main() int arr[10] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; int SumOfArr; SumOfArr = ArrAdder(arr, sizeof(arr)/sizeof(int)); printf( 배열의총합 : %d\n, SumOfArr); int ArrAdder (int * parr, int n) int sum = 0; for (int i=0; i<n; ++i) sum += parr[i]; return sum; 배열의길이도전달 Department of Computer Engineering 5
14-1 함수의인자로배열전달 "int * parr" vs. "int parr[ ]" 둘다같은의미를지닌다. 선언 "int parr[ ]" 은함수의매개변수선언시에만사용가능 int function(int parr[]) int a=10; parr=&a; // parr 이다른값을지니게되는순간 return *parr; Department of Computer Engineering 6
14-2 호출방식 Call-By-Value 값의복사에의한함수의호출 가장일반적인함수호출형태 #include <stdio.h> int add(int a, int b); C 동영상강좌중에서포인터부분을 CD 에구워서준다. int val1=10; int val2=20; printf(" 결과 : ", add(val1, val2)); int add(int a, int b) return a+b; Department of Computer Engineering 7
14-2 호출방식 Call-By-Value 에의한 swap int val1=10; int val2=20; swap(val1, val2); 여기에선안바뀜 printf("val1 : %d \n", val1); printf("val2 : %d \n", val2); void swap(int a, int b) int temp=a; a=b; b=temp; printf("a : %d \n", a); printf("b : %d \n", b); Department of Computer Engineering 8
Call-By-Reference 14-2 호출방식 C 동영상강좌의네트워크주소를알려준다. 참조 ( 참조를가능케하는주소값 ) 를인자로전달하는형태의함수호출 Department of Computer Engineering 9
14-2 호출방식 Call-by-Reference 에의한 swap 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); void swap(int* a, int* b) int temp=*a; *a=*b; *b=temp; 따라바뀜 Department of Computer Engineering 10
14-2 호출방식 scanf 함수호출시 & 를붙이는이유 case 1 case 2 int val; scanf("%d", &val);..... char str[100]; printf(" 문자열입력 : "); scanf("%s", str);..... Department of Computer Engineering 11
14-3 포인터와 const 포인터가가리키는변수의상수화 int a = 10; const int * p = &a; *p=30 // Error! a=30 // OK! 포인터상수화 int a=10; int b=20; int * const p = &a; p=&b // Error! *p=30 // OK! p 를통한 a 값변경금지 P 가가리키는주소변경금지 Department of Computer Engineering 12
14-3 포인터와 const const 키워드를사용하는이유 컴파일시잘못된연산에대한에러메시지 프로그램을안정적으로구성 #include <stdio.h> float PI=3.14; float rad; PI=3.07; // 분명히실수!! #include <stdio.h> const float PI=3.14; float rad; PI=3.07; // Compile Error 발생! scanf("%f", &rad); printf(" 원의넓이는 %f \n", rad*rad*pi); scanf("%f", &rad); printf(" 원의넓이는 %f \n", rad*rad*pi); Department of Computer Engineering 13
연습문제 다음함수에서 const 의역할은? void print (const int* arr, int size) int i; for (i=0; i<size; ++i) printf( %d, arr[i]); 문제점을찾아보자. void print (const int* ptr) int *p = ptr; *p = 20; printf( %d, *ptr); arr 을통한배열요소변경금지 const int * 타입은 int * 로대입이허용되지않음 const int * 로는대입이허용됨 Department of Computer Engineering 14
Summary 함수내에서값을바꾸고그값을호출한놈이써야한다면포인터를써라. Call-By-Reference 라고한다. Call-By-Value int val = 10; fct(val); void fct(int a) 가능하면변경된값은리턴값으로받으려고노력할것. 넘겨준값을함수내에서바꾸는 Side Effect( 부작용 ) 는좋지않음 Call-By-Reference int val = 10; fct(&val); void fct(int *pval) 여러개의값을함수로부터받을때는사용해야함 복사 값을변경할수없도록하려면 const 키워드를사용한다. Department of Computer Engineering 15