C 프로그래밍/11. 구조체

11.5 구조체와 함수

Recircle 2019. 6. 3. 11:08

구조체를 함수의 인수로 넘기는 경우, 다른 기본 자료형을 넘길 떄와 다르지 않다. 즉, 구조체의 복사본이 함수로 전달되게 ㅗ딘다. 그래서 시간과 메모리가 소요된다.




구조체를 함수의 인수로 전달하는경우

-구조체의 복사본이 함수로 전달된다

-반약 구조체의 크기가 크면 그만큼 시간과 메모리가 소요된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
 
 
struct student
{
    int number;
    char name[20];
    double grade;
};
int equal(struct student s1, struct student s2);
 
int main()
{
 
    struct student a = { 1"hong"3.8 };
    struct student b = { 2,"kim"4.0 };
    if (equal (a, b)==1)
    {
        printf("같은 학생\n");
    }
    else
    {
        printf("다른 학생\n");
    }
 
}
 
int equal(struct student s1, struct student s2)
{
    if (s1.number == s2.number)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
 
cs

이 함수의 인수는 2개이며 모두 구조체이다. 두개의 구조체 s1, s2를 받아서 멤버인 number가 같은지를 검사한다. 만약 number가 같으면 1을 반환하고 다르면 0를 반환한다.





구조체의 경우도 본사본이 함수로 전달되기 떄문에, 구조체의 크기가 크면 적지않은시관가 메모리를 차지한다. 따라서 구조체의 포인터를 인수로 보내면 좋다.

구조체의 포인터를 함수의 인수로 전달하는경우

-시간과 공간을 절약할 수 있다.

-원본 훼손의 가능성이 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int main()
{
 
    struct student a = { 1"hong"3.8 };
    struct student b = { 2,"kim"4.0 };
    if (equal (&a, &b)==1)
    {
        printf("같은 학생\n");
    }
    else
    {
        printf("다른 학생\n");
    }
 
}
 
int equal(struct student *p1, struct student *p2)
{
    if (p1->number == p2->number)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
 
cs

실행결과




구조체를 함수의 반환값으로 넘기는 방법

- 반환값의 형을 구조체로 표시해주면된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
 
struct student
{
    int number;
    char name[20];
    double grade;
};
 
struct student create()
{
    struct student s;
    s.number = 3;
    strcpy(s.name, "park");
    s.grade = 4.0;
    return s; // 구조체 s가
}
 
int main()
{
    struct student a;
    a = create(); // 구조체 a로 복사된다.
    printf("%d\t%s\t%lf\n", a.number, a.name, a.grade);
 
    return 0;
}
cs

구조체 s가 구조체 a로 복사된다.



//벡터의 합 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
struct vector {
    float x;
    float y;
};
 
struct vector get_vector_sum(struct vector a, struct vector b);
 
int main()
{
    struct vector a = { 2.0,3.0 };
    struct vector b = { 5.0,6.0 };
    struct vector sum;
 
    sum = get_vector_sum(a, b);
    printf("벡터의 합은 (%f, %f)입니다.\n", sum.x, sum.y);
 
    return 0;
}
 
struct vector get_vector_sum(struct vector a, struct vector b)
{
    struct vector result;
 
    result.x = a.x + b.x;
    result.y = a.y + b.y;
 
    return result;
}
cs