구조체와 함수
구조체는 함수의 인수로도 사용이 가능하고 반환값으로도 사용가능하다.
구조체를 함수의 인수로 넘길때는 "값에 의한 호출"을 사용하게 된다.
"값에 의한 호출" 즉, 복사를 사용하는 방법을 예제를 통해 알아보자.
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
|
#include <stdio.h>
struct student {
int num;
char *name;
float grade;
};
int equal(struct student s1, struct student s2)
{
if(s1.num == s2.num){
return 1;
}
else{
return 0;
}
}
int main(void)
{
struct student s1 = {1, "jin", 4.3};
struct student s2 = {2, "min", 3.7};
if(equal(s1, s2) == 1){
printf("동일합니다.\n");
}
else{
printf("다릅니다.\n");
}
return 0;
}
|
cs |
설명)s1구조체 변수, s2구조체 변수를 선언과 동시에 초기화한다. equal()함수를 보면 인수를 전달할때, 주소 연산자를 사용하지 않았다. (배열은 배열의 이름이 주소이지만 구조체는 X) 그러므로 복사가 일어난다. 각 구조체 변수의 멤버인 num이 동일하면 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
29
30
31
32
|
#include <stdio.h>
struct student {
int num;
char *name;
float grade;
};
int equal(struct student *s1, struct student *s2)
{
if(s1->num == s2->num){
return 1;
}
else{
return 0;
}
}
int main(void)
{
struct student s1 = {1, "jin", 4.3};
struct student s2 = {2, "min", 3.7};
if(equal(&s1, &s2) == 1){
printf("동일합니다.\n");
}
else{
printf("다릅니다.\n");
}
return 0;
}
|
cs |
설명) equal()함수의 매개변수를 포인터 형식으로 설정했다.
11) '->'연산자를 사용하여 멤버인 num에 접근했다. '->'의 뜻은 가르키는 것의 멤버로 가라! 라는뜻으로 s1->num의 뜻은 s1이 가르키는 구조체로 가서 멤버 num에 접근하라 라는 뜻이다.
24) equal()함수를 호출할 때, 인수를 &s1, &s2같은 주소형식으로 전달했다.
하지만 포인터를 사용하게되면 원본을 해칠 우려가 생긴다. 이를 막으려면 const지정자를 사용해야한다.
const 지정자를 사용
1
2
3
4
5
6
7
8
9
|
int equal(struct student const *s1, struct student const *s2)
{
if(s1->num == s2->num){
return 1;
}
else{
return 0;
}
}
|
cs |
이렇게 매개변수를 정의할 때, 앞에 const를 써주면 구조체를 변경하는것이 금지된다.
구조체를 함수의 반환값으로 넘긴다.
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
|
#include <stdio.h>
struct student {
int num;
char *name;
float grade;
};
struct student creat()
{
struct student s = {1, "jin", 4.3};
return s;
}
int main(void)
{
struct student s1 = creat();
printf("%d\n", s1.num);
printf("%s\n", s1.name);
printf("%f\n", s1.grade);
return 0;
}
|
cs |
설명) struct student가 반환형인 creat()함수를 정의했다. 이 함수에서는 구조체 변수를 선언 및 초기화 한 다음에 그 구조체를 반환하는 함수다. main함수에서는 student구초체 변수를 선언하고 creat()에서 반환된 값을 받는다. 즉, creat()함수에서 반환된(생성된)구조체가 s1구조체의 데이터가 되게된다.
구조체를 반환형으로 사용한다면 여러개의 값을 반환할 수 있다는 장점이 있다. 이 함수같은 경우 num, name, grade를 한번에 반환하는 것과 같다.
'C프로그래밍 > 개인 공부' 카테고리의 다른 글
C언어 - 동적 메모리 (0) | 2022.12.14 |
---|---|
C언어 - 열거형(enumeration) (0) | 2022.12.11 |
C언어 - 구조체안에 문자배열? or 문자형을 가르키는 포인터? (0) | 2022.12.11 |
C언어 - 구조체와 포인터 (0) | 2022.12.10 |
C언어 - 문자열을 정수로, 정수를 문자열로 바꾸기 (0) | 2022.12.10 |