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
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바