정보처리기사

[정보처리기사] C언어 특강 37~48강 정리(함수에 주소전달)

jaeheon0520 2024. 10. 6. 20:12

함수란?

반복적인 수행을 정의해 놓은 작은 프로그램 단위

 

함수 구조

반환타입 함수명 (인자들...) {

    작업1

    작업2

}

 

아래 문제 중요!!

#include <stdio.h>
void swap(int a, int b) { // swap을 먼저 선언해주던가, 아니면 코드 자체를 main 위에 써줌
    int temp;
    temp = a;
    a = b;
    b = temp;
}

int main() {
    int k, j;
    k = 3;
    j = 2;
    swap(k, j);
    printf("k = %d, j = %d", k, j); // 3 2
    return 0;
}

// swap 변수 안에서 교체 된 변수들은 함수의 종료와 함께 모두 메모리에서 지워지고 있다.
// 즉, 메인함수에서는 아무것도 변화되지 않는다
// 만약 전역 변수였다면 main에 있는 변수도 바뀜, 혹은 주소값을 전달하거나 함수가 리턴값을 줘야한다

 

함수와 반복문

#include <stdio.h>
int func(int n);
int main(void){
    int num;
    printf("%d\n", func(5)); // 5
    return 0;
}

int func(int n){
    if(n < 2)
    	return n;
    else {
        int i, tmp, current = 1, last = 0;
        for (i = 2; i <=n; i++) {
			tmp = current; 
            current += last; 
            last = tmp; 
        }
        return current;
    }
}
// 5값을 리턴하고 모든 지역변수는 메모리에서 내려감

// tmp     : ? -> 1 -> 1 -> 2 -> 3 
// currnet : 1 -> 1 -> 2 -> 3 -> 5
// last    : 0 -> 1 -> 1 -> 2 -> 3

 

함수에 주소전달

main과 다른 함수에서 사용되는 변수의 이름이 같을 때 지역변수인지, call by reference 인지 이런 것들 잘 체크하기

#include <stdio.h>
int main() {
    int x = 10, y = 20;
    printf("%d", f(&x, y)); // 51
    printf("%d %d\n", x, y); // 15 20
}

int f(int *i, int j) { // 주소로 전달할 때는 이렇게 주고 받는다
    *i += 5; // 15 20
    return (2 * *i + ++j); // 51, *i = 15, j = 21 이지만 j 같은 경우는 지역변수이므로 메모리에서 내려온다
}

 

 

#include <stdio.h>
void change(int *px, int *py, int pc, int pd) {
    *px = *py + pd; // x = 60
    *py = pc + pd; // y = 70
    pc = *px + pd; // pc = 100
    pd = *px + *py; // pd = 130
}
void main(void) {
    int a=10, b=20, c=30, d=40;
    change(&a, &b, c, d);
    printf("a=%d, b=%d, c=%d, d=%d", a, b, c, d); // 60 70 30 40
}

 

#include <stido.h>
double h(double *f, int d, double x) { // f 주소, 4, 2
    int i;
    double res = 0.0;
    for (i = d-1; i >= 0; i--) { // i = 3
    	res = res * x + f[i]; // 49
    }
    return res;
}
int main() {
    double f[] = {1, 2, 3, 4};
    printf("%3.1f\n", h(f, 4, 2)); // 49.0 소수점과 함께 4자리인 경우이므로 3을 초과해서 출력된다고 한다
    return 0;
}

 

#include <stido.h>
void func(int *a, int b, int *c) {
    int x;
    x = *a; // x = 20
    *a = x++; // a = 20, x = 21
    x = b; // x = 20
    b = ++x; // b = 21, x = 21
    --(*c); // c = 19
}
int main () {
    int a, b, c[1];
    a = 20;
    b = 20;
    c[0] = 20;
    func(&a, b, c);
    printf("a=%d b=%d c=%d", a, b, c[0]); // 20 20 19
    return 0;
}

 

아래 실수하기 좋은 문제!

#include <stiod.h>
#define 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); 
    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; // y = 10
    n = *(m+1) + (*m+2); // n = 6
    *x = ++n; // a = 7
}

 

다음은 숫자를 처리하는 C 프로그램이다. 3 2 1 4를 입력하였을 때의 출력 결과를 작성하시오.

#include <stdio.h>
void a(int n, int *num) {
    for (int i = 0; i< n; i++)
    	scanf("%d", &(num[i])); // 2 1 4
}
void b(int n, int *lt) {
    int a, b;
    for (a = 0; a < n-1; a++)
    	for (b = a+1; b < n; b++)
        	if (lt[a] > lt[b]) 
            	c(lt+a, lt+b);
}
void c(int *a, int *b) {
    int t;
    t = *a;
    *a = *b;
    *b = t;
}
int main() {
    int n;
    int *num;
    printf("How many numbers?");
    scanf("%d", &n); // 3
    num = (int *)malloc(sizeof(int) * n);
    a(n, num);
    b(n, num);
    for (int i = 0; i < n; i++)
    	printf("%d", num[i]); // 1 2 4
}