Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C언어에서 함수에 구조체 전체를 인수로 전달하는 방법

구조체를 함수로 전달하는 세 가지 방법

C언어에서 구조체의 값을 한 함수에서 다른 함수로 전달하는 방법은 크게 세 가지가 있습니다.

  • 개별 멤버를 함수의 인수로 전달하는 방법
  • 구조체 전체를 함수의 인수로 전달하는 방법
  • 구조체의 주소를 함수의 인수로 전달하는 방법

이번 글에서는 그중 구조체 전체를 함수의 인수로 전달하는 방법을 자세히 살펴보겠습니다.

구조체 전체 전달 방식의 특징

  • 함수를 호출할 때 구조체 변수의 이름을 인수로 지정합니다.
  • 함수의 매개변수 부분에서 이 값을 다른 구조체 변수로 받습니다.
  • 단점으로는 구조체 전체의 복사본이 새로 생성되기 때문에 메모리가 낭비될 수 있다는 점이 있습니다.

예제 1: 날짜 구조체 전달하기

다음 프로그램은 구조체 전체를 함수의 인수로 전달하는 기본적인 방법을 보여줍니다.

#include <stdio.h>
struct date {
    int day;
    char month[10];
    int year;
};
int main() {
    struct date d;
    printf("enter the day, month and year:");
    scanf("%d%s%d", &d.day, d.month, &d.year);
    display(d); // 구조체 전체를 함수의 인수로 전달
    return 0;
}
void display(struct date d) {
    printf("day=%d\n", d.day);
    printf("month=%s\n", d.month);
    printf("year=%d\n", d.year);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

enter the day, month and year:18 JAN 2021
day=18
month=JAN
year=2021

예제 2: 두 변수의 합 구하기

다음 예제는 구조체 전체를 함수의 인수로 전달하여 두 변수의 합을 계산하는 C 프로그램입니다.

#include <stdio.h>
// 구조체 선언
struct add {
    int var1;
    int var2;
} a;
// 함수 선언 및 정의
void show(struct add a) {
    // 합계 변수 선언
    int sum;
    // 산술 연산
    sum = a.var1 + a.var2;
    // 결과 출력
    printf("Added value is %d", sum);
}
void main() {
    // 구조체 변수 선언
    struct add a;
    // 사용자 입력 받기
    printf("Enter variable 1 = ");
    scanf("%d", &a.var1);
    printf("Enter variable 2 = ");
    scanf("%d", &a.var2);
    // 함수 호출
    show(a);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Enter variable 1 = 20
Enter variable 2 = 50
Added value is 70

예제 3: 학생 성적 구조체 배열 전달하기

마지막 예제는 구조체 배열 전체를 함수의 인수로 전달하여 학생별 과목 합계를 계산하는 C 프로그램입니다. 구조체 선언부터 함수 선언, 호출까지 전반적인 과정을 확인할 수 있습니다.

#include <stdio.h>
// 구조체 선언
struct student {
    int s1, s2, s3;
} s[5];
// 함수 선언 및 정의
void addition(struct student s[]) {
    // 반복문 변수와 합계 변수 선언
    int i, sum;
    // 산술 연산
    for (i = 1; i < 4; i++) {
        sum = s[i].s1 + s[i].s2 + s[i].s3;
        printf("Student %d scored total of %d\n", i, sum);
    }
}
void main() {
    // 반복문용 변수 선언
    int i;
    // 반복문을 통해 사용자 입력 받기
    for (i = 1; i < 4; i++) {
        printf("Enter marks for student %d in subject 1 = ", i);
        scanf("%d", &s[i].s1);
        printf("Enter marks for student %d in subject 2 = ", i);
        scanf("%d", &s[i].s2);
        printf("Enter marks for student %d in subject 3 = ", i);
        scanf("%d", &s[i].s3);
    }
    // 함수 호출
    addition(s);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Enter marks for student 1 in subject 1 = 25
Enter marks for student 1 in subject 2 = 89
Enter marks for student 1 in subject 3 = 45
Enter marks for student 2 in subject 1 = 12
Enter marks for student 2 in subject 2 = 45
Enter marks for student 2 in subject 3 = 89
Enter marks for student 3 in subject 1 = 12
Enter marks for student 3 in subject 2 = 78
Enter marks for student 3 in subject 3 = 12
Student 1 scored total of 159
Student 2 scored total of 146
Student 3 scored total of 102

정리

구조체 전체를 함수로 전달하면 여러 데이터를 한 번에 넘길 수 있어 코드가 간결해지고 가독성이 좋아집니다. 다만 구조체의 크기가 클 경우 복사본 생성으로 인한 메모리 낭비와 성능 저하가 발생할 수 있습니다. 이러한 단점을 보완하려면 구조체의 주소(포인터)를 전달하는 방식을 사용하는 것이 효율적입니다.