[14] 구조체를 입력으로 이용하는 함수 (function using struct as input)

C언어 함수 정리

참고 문헌 (Ch 65) : https://dojang.io/mod/page/view.php?id=570

함수에서 구조체 매개변수 사용하기

구조체 매개변수 사용하기

함수에서 구조체를 매개변수로 사용하기 위해서는 struct 키워드와 구조체 이름으로 매개변수를 지정한다.

1
2
3
반환값자료형 함수이름(struct 구조체이름 매개변수)
{
}

예시

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
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더 파일

struct Person {
char name[20];
int age;
char address[100];
};

void printPerson(struct Person p) // 반환값 없음, 구조체 매개변수 한 개 지정
{
// 구조체 매개변수 멤버의 값 출력
printf("이름: %s\n", p.name); // 이름: 홍길동
printf("나이: %d\n", p.age); // 나이: 30
printf("주소: %s\n", p.address); // 주소: 서울시 용산구 한남동
}

int main()
{
struct Person p1;

strcpy(p1.name, "홍길동");
p1.age = 30;
strcpy(p1.address, "서울시 용산구 한남동");

printPerson(p1); // 함수를 호출할 때 구조체 변수 전달, 멤버가 복사됨

return 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
29
30
31
32
33
34
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더 파일

struct Person {
char name[20];
int age;
char address[100];
};

void setPerson(struct Person p) // 반환값 없음, 구조체 매개변수 한 개 지정
{
// 매개변수로 받은 구조체 멤버의 값 변경
strcpy(p.name, "고길동");
p.age = 40;
strcpy(p.address, "서울시 서초구 반포동");
}

int main()
{
struct Person p1;

strcpy(p1.name, "홍길동");
p1.age = 30;
strcpy(p1.address, "서울시 용산구 한남동");

setPerson(p1); // 함수를 호출할 때 구조체 변수 전달, 멤버가 복사됨

// setPerson에서 변경한 값은 영향을 미치지 않음
printf("이름: %s\n", p1.name); // 이름: 홍길동
printf("나이: %d\n", p1.age); // 나이: 30
printf("주소: %s\n", p1.address); // 주소: 서울시 용산구 한남동

return 0;
}

구조체 포인터 매개변수 사용하기

괄호 안에서 구조체 이름 뒤에 *를 붙여서 포인터 형태의 매개변수로 이용한다.

1
2
3
반환값자료형 함수이름(struct 구조체이름 *매개변수)
{
}

예시

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
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더 파일

struct Person {
char name[20];
int age;
char address[100];
};

void setPerson(struct Person *p) // 반환값 없음, 구조체 포인터 매개변수 한 개 지정
{
// 매개변수로 받은 포인터에서 구조체 멤버의 값 변경
strcpy(p->name, "고길동");
p->age = 40;
strcpy(p->address, "서울시 서초구 반포동");
}

int main()
{
struct Person p1;

strcpy(p1.name, "홍길동");
p1.age = 30;
strcpy(p1.address, "서울시 용산구 한남동");

setPerson(&p1); // 함수를 호출할 때 구조체 변수의 메모리 주소를 전달

// setPerson에서 변경한 값이 출력됨
printf("이름: %s\n", p1.name); // 이름: 고길동
printf("나이: %d\n", p1.age); // 나이: 40
printf("주소: %s\n", p1.address); // 주소: 서울시 서초구 반포동

return 0;
}