728x90
반응형
함수와 구조체
함수에서의 구조체 사용
- 구조체를 함수의 매개변수로 사용
- 구조체 포인터를 함수의 매개변수로 사용
구조체를 함수의 매개변수로 사용
- 일반변수를 함수의 매개변수로 사용하는 것과 동일
- 매개변수가 구조체인 경우 함수의 형식매개변수를 구조체로 선언
- 해당 구조체 전체가 복사되기 때문에 편리하다
- 구조체 전체가 복사되기 때문에 시간이 많이 걸리고, 기억공간 낭비가 심하다
구조체를 함수의 매개변수로 사용한 예
#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 |
댓글