함수에 주소 전달
#include<stdio.h>
int main(void){
int x = 10, y = 20;
printf("%d", f(&x, y)); // f 함수에서 리턴된 51 출력
printf("%d %d\n", x, y);
}
int f(int *i, int j){ // *i = x의 주소값, j = y 값을 대입
*i += 5; // *i = *i+5, *i는 x의 주소값이므로 10+5
return(2 * *i + ++j); // 2*15 + (20+1) 이므로 51 이 리턴
}
함수와 변수의 유효 범위
include<stdio.h>
int a = 1, b = 2, c = 3; // 전역 변수
int f(void);
int main(void){ // f 함수의 결과로 12가 리턴됨
printf("%3d\n", f()); // %3d = 세개의 공간에 오른쪽부터 채워서 출력하므로 12
printf("%3d%3d%3d\n", a, b, c); // 전역 변수에 있는 값 4 2 3 출력
return 0;
}
int f(void){
int b, c;
a=b=c=4; // 가까운 변수 b, c에 4 대입하고 a는 전역 변수에 4 대입
return(a+b+c); // 4+4+4 이므로 12 리턴 후 변수는 폐기됨
}
※ 함수의 변수 유효 범위에서 유의할 점은 가까이에 있는 변수에 대입하는 것
함수에 주소 전달
#include<stdio.h>
void main(){
int a = 5;
int b = 3;
int c = 0;
b = foo(a, &c); // foo 함수 수행 후 4가 리턴됨
c = foo(b, &a); // 위에서 수행한 내용 폐기한 후 다시 수행하면 3이 리턴됨
printf("a=%d b=%d c=%d", a, b, c);
}
int foo(int a, int *b){ // *b 에 c, a 의 주소값이 대입
int c;
*b = a + 1; // b 가 가리키는 값에 +1 한 후 대입
c = a - 1;
return c; // 최종 c 값 리턴 후 폐기
}
#include<stdio.h>
void main(){
int value = 3, list[4] = {1, 3, 5, 7};
int i;
swap(value, &list[0]); // &list[0]은 list 배열 첫번째 주소값
swap(list[2], &list[3]);
swap(value, &list[value]); // 두번째 변수는 value=3이므로 list[3]의 주소값
for(i = 0; i < 4; i++)
print("%d", list[i]); // 리스트를 하나씩 출력하므로 3 3 5 3
}
void swap(int a, int *b){ // swap은 변수의 자리를 바꾸는 알고리즘
int temp;
temp = a;
a = *b; // a에 포인터 변수 b가 가리키는 값을 대입
*b = temp; // 포인터 변수 b가 가리키는 값에 temp 값을 대입
} // 함수가 끝나면 변수 값은 모두 폐기
함수가 주소를 리턴
#include<stdio.h>
int main(){
int i;
int x = 10;
int *p;
int a[100]; // 정수 100개로 구성된 배열 a
for(i = 0; i < 100; i++)
a[i] = i * 10; // i * 10 한 값을 배열 a의 i 자리에 대입
p = func(x, a); // func 함수로 이동해서 연산 수행 후 리턴 값을 가져옴
printf("sum=%d", x + a[0] + a[1] + p[0] + p[1]); // 10 + 0 + 20 + 20 + 20, sum=70 출력
}
int *func(int a, int *x){
a = a + 10;
x = x + 1; // x의 다음 주소값을 의미
*x = *x * 2; // x가 가리키는 값에 *2 한 값을 대입
return x; // x를 func를 호출한 곳으로 리턴하므로 p 값에 대입
}
함수에 주소 전달
#include<stdio.h>
void main(void){
int a = 10, b = 20, c = 30, d = 40;
change(&a, &b, c, d); // change 함수에 a, b의 주소값, c, d값 대입하여 연산 수행
printf("a=%d, b=%d, c=%d, d=%d, a, b, c, d);
}
void change(int *px, int *py, int pc, int pd){
*px = *py + pd;
*py = pc + pd;
pc = *px + pd;
pd = *px + *py;
}
#include<stdio.h>
int main(){
double f[] = {1, 2, 3, 4};
printf("%3.1f\n", h(f, 4, 2)); // 소수점 첫번째 자리까지 출력하므로 49.0
return 0;
}
double h(double *f, int d, double x){
int i;
double res = 0.0;
for(i = d-1; i >= 0; i--){
res = res * x + f[i]; // res * i를 수행한 후 배열 f의 i 값을 더함
}
return res; // res 값을 h 함수를 호출했던 자리로 리턴
}
#include<stdio.h>
#define SIZE 3 // 앞으로 나오는 SIZE에 3 대입
void func(int *m, int *a, int b);
int main(void){
int num[SIZE] = {1, 3, 6};
int a = 10, b = 30;
func(num, &a, b); // num, a의 주소값, b의 값을 func 함수로 넘김
printf("a=%d, b=%d\n", a, b); // a=7, b=30 이 출력됨
return 0;
}
void func(int *m, int *x, int y){
int i = 0, n = 0;
y = *x;
n = *(m + 1) + (*m + 2); // *(m의 주소값+1) + (m이 가리키는 값+2) 이므로 3 + 3
*x = ++n;
}