C

함수에 주소 전달/리턴, 함수와 변수의 유효범위

김꼬알 2023. 4. 11. 18:34

함수에 주소 전달

#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;
}

'C' 카테고리의 다른 글

static 변수  (0) 2023.04.11
함수, 반복문  (0) 2023.04.06
배열 포인터  (0) 2023.04.05
구조체, 포인터 이동  (0) 2023.04.05
포인터 배열  (0) 2023.04.04