C 언어 포인터 정복하기
TAE-HYONG KIM
COMPUTER ENG, KIT
8강. 포인터로 함수 넘나들기
학습 내용
포인터를 통한 함수 호출
포인터 인자를 사용하는 함수 예
배열을 인자로 하는 함수 호출 분석
배열 인자를 함수에서 포인터로 다루기
2
scanf()와 printf()
scanf()
사용자가 입력할 정수 값을 저장할 변 수 a의 포인터(&a: 시작주소, 자료형) 를 scanf()함수에게 인자로 넘겨주어 호 출한다
scanf()함수 내부 포인터변수에 인자로 받은 포인터가 저장되고 scanf()함수는 사용자에게 입력 받은 정수를 해당 위 치에 복사한다 a값 변경됨
포인터를 인자로 하는 함수 호출:
참조 에 의한 호출 (Call by Reference)
3
int a = 0;
printf(“정수값을 입력하세요: ”);
scanf(“%d”, &a);
printf(“%d”, a);
scanf(“%d”, &a);
변수
포인터변수에 저장
포인터
입력scanf()와 printf() (2)
printf()
화면에 출력해야 할 변수 값(a)을 printf()함수에게 인자로 넘겨주어 호출한다
printf() 함수 내부 변수에 인자로 받은 정수 값이 저장되고 printf() 함수는 그 값을 화면에 출력한다 (printf()함수는 외부 변수 a에 영
향을 줄 수 없다)
값을 인자로 하는 함수 호출: 값에
의한 호출 (call by value)
4
int a = 0;
printf(“정수값을 입력하세요: ”);
scanf(“%d”, &a);
printf(“%d”, a);
printf(“%d”, a);
변수
내부변수에 저장
값 접근불가
포인터를 통한 함수 호출
인자로 주어지는 포인터 값을 받기 위해
피호출 함수는 포인터변수를 인자로 선언 해야 한다5
int main(void) { int a = 0;
...
func(&a);
...
}
10 11 12 13 14
100 101 102 103 104
main() func()
void func(int *a) { ...
*a = 20;
...
}
a 0
a 10
20
포인터 인자를 사용하는 함수 예
6
패턴 12
두 변수의 값을 바꾸는 함수(swap)
#include <stdio.h>
void swap(int *, int *);
int main(void) {
int val1=10, val2=20;
swap(&val1, &val2);
printf(“val1:%d,val2:%d\n”, val1, val2);
return 0;
}
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
배열을 인자로 하는 함수 호출
배열 이름이 함수 인자로 사용될 때(R-value)
배열의 첫 번째 요소를 가리키는 포인터상수
배열이라는 정보 자체가 존재하지 않음
포인터상수를 함수 인자로 받기 위해서 포인터 변수가 필요
parr은 arr[0]을 가리키는 포인터를 갖는다
parr을 arr 대신 배열이름으로 사용하여 접근 가능
7
int sum, arr[] = { 3, 4, 5, 6, 7 };
sum = arrSum(arr, sizeof(arr)/sizeof(arr[0]));
int arrSum(int arr[], int arrSize) { ...
int arrSum(int *parr, int arrSize) { ...
... sum += parr[i]; // sum += *(parr+i);
배열 인자를 포인터로 저장하는 함수 예
8
패턴 1-3
배열의 평균을 구하는 함수
#include <stdio.h>
double average(int *, int);
int main(void) {
int arr[] = { 3, 4, 5, 6, 7 };
int *p = arr, size;
size = sizeof(arr)/sizeof(p[0]);
printf(“average: %.2f\n”, average(arr, size));
return 0;
}
double average(int *val, int size) {
int r, sum = 0;
for (i=0; i<size; i++)
sum += *(val+i); // sum += val[i];
return (double)sum/size;
}
배열 인자를 포인터로 저장하는 함수 예(2)
패턴 6-1
일차원 배열 내림차순으로 정렬하는 함수
#include <stdio.h>
extern void swap(int *, int *);
void sort(int *, int);
int main(void) {
int arr[] = { 25, 17, 32, 58, 41 }, i, size;
size = sizeof(arr)/sizeof(arr[0]);
sort(arr, size);
for (i=0; i<size; i++)
printf(“arr[%]=%d\n”, i, arr[i]);
return 0;
}
void sort(int *val, int size) {
int i, j;
for (i=0; i<size-1; i++) // 가장 큰 수가 될 변수 for (j=i+1; j<size; j++) // 비교되는 수
if (val[i]<val[j]) // if (*(val+i)<*(val+j))
swap(&val[i], &val[j]); // swap(val+i, val+j);
}
배열 인자를 포인터로 저장하는 함수 예(2)
패턴 9-1
문자열 뒤집어 저장하는 함수
#include <stdio.h>
#include <string.h> // for strlen() extern void swapchar(char *, char *);
void revstr(char *);
int main(void) {
char str[] = “hello”;
revstr(str);
printf(“reversed str = %s\n”, str);
return 0;
}
void revstr(char *str) {
int len, i;
len = strlen(str); // or len = sizeof(str)-1;
for (i=0; i<len/2; i++) // 중간문자까지 swapchar(&str[i], &str[len-1-i]);
} // swapchar(str+i, str+len-1-i);
포인터 인자 함수 호출 정리
함수 인자로 포인터 변수를 써야 하는 경우
변수의 포인터로 인자로 넘길 때 (&a)
포인터 변수를 인자로 넘길 때 (p)
1차원 배열 이름을 인자로 넘길 때(arr)
1차원 배열 이름을 인자로 함수 호출할 때 함수 인자
크기 없는 배열 (arr[]) 배열명, 포인터로 모두 사용가능
포인터 변수(*arr) 배열명, 포인터로 모두 사용가능
남은 함수 인자 결정 문제
문자열 상수(“hello”)를 인자로 함수 호출할 때(printf()등)
이차원 배열 이름을 인자로 함수 호출할 때