본문 바로가기
프로그래밍 언어/C

C언어 - 구조체와 공용체(2)

by nomfang 2021. 3. 23.
728x90
반응형

함수와 구조체

함수에서의 구조체 사용

  1. 구조체를 함수의 매개변수로 사용
  2. 구조체 포인터를 함수의 매개변수로 사용

구조체를 함수의 매개변수로 사용

  • 일반변수를 함수의 매개변수로 사용하는 것과 동일
  • 매개변수가 구조체인 경우 함수의 형식매개변수를 구조체로 선언
  • 해당 구조체 전체가 복사되기 때문에 편리하다
  • 구조체 전체가 복사되기 때문에 시간이 많이 걸리고, 기억공간 낭비가 심하다
구조체를 함수의 매개변수로 사용한 예
#include <stdio.h>

struct num calc(struct num);  // 구조체 함수 원형 정의

struct num {  // 구조체 선언
  int x;
  int y;
  int sum;
  int mul;
};

int main(void) {
  struct num number1; // 구조체 변수 선언
  number1.x=10;
  number1.y=20;
  number1 = calc(number1);  // 피호출 함수 calc()에 struct num 형 구조체를 매개변수로 넘겨준다
  printf("%d, %d, %d, %d \n",number1.x, number1.y, number1.sum, number1.mul);
}

struct num calc(struct num number2){  // number2는 number1을 그대로 복사하여 넘겨 받음
  number2.sum = number2.x + number2.y;    // 넘겨받은 struct num형 구조체 멤버끼리 계산
  number2.mul = number2.x * number2.y;
  return(number2);  //구조체를 리턴한다
}

함수의 원형 정의에 대한 설명

struct num clac(struct num number2); // 함수의 원형 정의
-> struct num은 하나의 자료형으로 int calc(int number2)와 같은 개념이지만 구조체를 사용하는 것

구조체 포인터를 함수의 매개변수로 사용

  • 참조에 의한 자료 전달 방식
  • 일반적으로 구조체 포인터를 함수의 매개변수로 사용
  • 구조체 자체를 복사하지 않기 때문에 실행속도가 향상되고, 기억공간 효율성 좋음
구조체 포인터를 함수의 매개변수로 사용한 예
#include <stdio.h>

struct num calc(struct num*);  // 구조체 포인터 사용

struct num {
  int x;
  int y;
  int sum;
  int mul;
};

int main(void) {
  struct num number1;
  number1.x=10;
  number1.y=20;
  number1 = calc(&number1);  // number1의 주소값을 사용하기 위해 참조호출 & 사용
  printf("%d, %d, %d, %d \n",number1.x, number1.y, number1.sum, number1.mul);
}

struct num calc(struct num *number2){  //  구조체 포인터 사용
  number2->sum = number2->x + number2->y;  // 포인터를 전달 받았기 때문에 . 이 아닌 -> 를 사용
  number2->mul = number2->x * number2->y;
  return(*number2);
}

typedef

** 이미 존재하는 자료형에 새로운 이름을 붙이기 위한 키워드

  • 간단하거나 의미있는 이름으로 바꿀 수 있어 프로그램 이해가 쉽다
  • 구조체 형을 선언하는데 많이 사용된다
  • 형식 : typedef 기존 자료형 새로운 자료형
  • 사용예 :
typedef int INT; INT a = 1; // 컴파일러가 INT를 int로 해석한다

typedef int\* PTR; // int 포인터를 PTR로 재정의  
PTR p1, p2 // int\* p1, p2 와 동일하다

#include <stdio.h>

struct data{  
int x;  
int y;  
};  
typedef struct data DATA;  
void main() {  
DATA d = {1, 2}; // struct data의 x, y에 각각 1과 2를 대입  
printf("%d, %d \\n", d.x, d.y);  
}

구조체의 비트 필드

  • 주기억장치의 기억공간을 byte 단위가 아닌 bit단위로 사용
    -> 기억공간의 낭비를 방지하기 위해

구조체 비트 필드의 정의

struct 비트필드명{
    자료형 비트필드 변수: 비트크기;
}

struct test{
    unsigned short a: 4;  // 숫자는 비트 크기를 의미함
    unsigned short b: 2;
    unsigned short c: 1;
    unsigned short d: 7;
}
struct test bit;

구조체 비트필드의 기억공간 구조

구조체 비트필드의 참조 예

비트필드가 2개의 int기억공간 사이에 걸쳐 저장될 수 없다

공용체의 개념

  • 동일한 기억장소에 여러 유형의 자료를 저장하기 위해 프로그래머가 선언한 자료형
  • 공용체 안에 포함된 자료들이 같은 기억장소를 공유하여 사용
  • 사용될 자료의 자료형이 유동적일 경우 기억공간을 효율적으로 사용

공용체의 예

  • 공용체 멤버들이 완전히 다른 자료형을 가질 때 기억공간을 절약하기 위해 사용

ex) 원화와 달러를 동시에 처리할 경우 공용체를 사용하여 달러는 실수형으로 하는 등
메모리의 자료형을 선택하여 값을 저장 가능

union 공용체명{
    멤버1;
    멤버2;
}

union var{
    char a;
       int b;
    float c;
} 
union var abc;

abc.a = 'a';
abc.b = 123;
abc.c = 1.23;
공용체의 사용
  • 공용체가 사용되면 멤버중 가장 큰 멤버에 대해서만 기억공간이 할당됨
  • 할당된 기억공간의 시작 위치부터 각 부분을 다른 멤버들과 공용으로 사용

가장 큰 멤버의 기억공간을 미리 선점해놓고
공용체 멤버로 지정된 변수들이 하나씩 공간을 사용할 수 있는듯 하다
작은것 두 개를 동시에 사용할 수 있을지..

반응형

'프로그래밍 언어 > C' 카테고리의 다른 글

C언어) 파일처리함수(2)  (0) 2021.04.03
C언어 - 파일처리 함수(1)  (0) 2021.03.26
C언어 - 11. 구조체와 공용체  (0) 2021.03.21
C언어 - 10. 배열과 포인터 (3)  (0) 2021.03.17
C언어 - 9. 배열과 포인터(2)  (0) 2021.03.17

댓글