C언어 - 구조체와 함수

2022. 12. 11. 02:07·C프로그래밍/개인 공부

구조체와 함수

 

구조체는 함수의 인수로도 사용이 가능하고 반환값으로도 사용가능하다.

구조체를 함수의 인수로 넘길때는 "값에 의한 호출"을 사용하게 된다.

"값에 의한 호출" 즉, 복사를 사용하는 방법을 예제를 통해 알아보자.

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;
}
 
Colored by Color Scripter
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;
}
Colored by Color Scripter
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;
    }
}
Colored by Color Scripter
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;
}
Colored by Color Scripter
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
'C프로그래밍/개인 공부' 카테고리의 다른 글
  • C언어 - 동적 메모리
  • C언어 - 열거형(enumeration)
  • C언어 - 구조체안에 문자배열? or 문자형을 가르키는 포인터?
  • C언어 - 구조체와 포인터
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
        • start_contribute()
        • start_analyse()
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    동적메모리
    INIT
    순환
    rubikpi3
    rubik pi
    스택
    드라이버 분석
    C++
    포인터
    토발즈
    commit
    c언어
    Branch
    커널 기여
    커널
    파일 입출력
    자료구조
    arm
    버퍼
    리눅스
    이진 트리
    Git
    앤드류모튼
    피보나치
    백준
    Qualcomm
    소수
    파이썬
    yolo
    시스템콜
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
C언어 - 구조체와 함수
상단으로

티스토리툴바