728x90
1. 구조체 : 서로 다른 자료형을 갖는 변수들을 대표 이름으로 묶어 놓는 것
구조체를 선언하는 방법에는 세가지가 있다.
// 1
struct student {
int id;
char name[10];
dounle grade;
}; // 마지막에 세미클론 붙여주어야 함
struct student a; // OR student a;
// 선언과 동시에 초기화 하기
struct student a = {20210123, "민지", 4.5};
// 2
struct student {
int id;
char name[10];
dounle grade;
} a;
//3
typedef struct {
int id;
char name[10];
dounle grade;
} student;
student a;
typedef의 경우 데이터 형의 이름을 새로운 이름으로 바꿀 때 사용한다.
구조체 태그 이름이 없는 구조체 변수를 선언할 때는 이 구조체와 동일한 자료형의 변수를 더 이상 선언할 수 없다 !! 단 한번 이 구조체형으로 변수를 선언하는 경우에만 이용한다
struct {
char name[12];
int num;
double balance;
} youraccount; // youraccount의 구조체 재사용은 불가능!
2. 구조체의 멤버연산자와 화살표 연산자
멤버 연산자 (.) : 구조체에서 구조체 멤버로 접근 ex) 구조체변수이름.멤버변수이름
화살표 연산자 (->): 구조체 포인터로 구조체 멤버를 참조할 때 사용. ex) 구조체포인터이름->멤버변수이름
간접 참조 연산자 (*): 구조체 포인터로 구조체 멤버를 참조할 때 사용 ex) (*구조체포인터이름).멤버변수이름
struct student s ={201711, "Woo", 4.5};
struct student *p; // 구조체 포인터 선언
p = &s; // 구조체 s의 첫번째 주소를 p에 저장
printf("이름 : %s", s.name);
printf("이름 : %s", p->name);
printf("이름 : %s", (*p).name);
3. 구조체 변수의 대입과 비교
같은 구조체 변수끼리 대입은 가능하지만 비교는 불가능 하다
struct point {
int x;
int y;
};
int main(void) {
struct point p1 = {10, 20};
struct point p2 = {11, 21};
p2 = p1; // p2에 p1을 대입할 수 있다.
if (p1 == p2)
printf("equal \n") // 비교 -> 컴파일 에러 !
if (p1.x == p2.x)
printf("equal \n") // 올바른 비교 !
}
4. 구조체와 함수
구조체를 함수의 인자로 전달하는 경우 구조체의 복사본이 함수에 전달되게 된다 !!
구조체를 반환하는 경우에도 구조체의 복사본이 반환된다.
struct student create(){
struct student new_student;
new_student.id = 202110;
strcpy(new_student.name, "minji");
new_student.grade = 5.0;
return new_student;
};
int main(void) {
struct student a;
a = create(); // 구조체 new_student가 구조체 a로 복사된다.
return 0;
}
5. 구조체의 크기 : sizeof()
구조체는 byte padding 때문에 멤버들의 크기의 합계보다 클 수 있다 .
byte padding : 사용하지 않는 자투리 메모리 공간, 실제 CPU가 어드레싱 또는 메모리 관리 효율을 위해 변수의 주소가 1, 2, 4, 8 등의 배수일 것이 요구됨.
6. 자기 참조 구조체
멤버의 데이터형으로 자신의 구조체 형을 사용한다. 구조체 자체를 멤버로 사용할 수는 없지만, 구조체의 데이터형과 같은 포인터를 멤버로 가지는 것은 가능하다. 포인터 멤버는 자기 자신을 가리키게 된다.
struct node {
char data;
struct node * link;
};
728x90
'Programming Languages > C와 C++' 카테고리의 다른 글
C언어 enum (열거형) (0) | 2021.12.14 |
---|---|
C언어 공용체 (0) | 2021.12.14 |
C언어 배열에서 포인터 사용하기 (0) | 2021.09.29 |
C배열의 크기 구하기 sizeof() (0) | 2021.09.29 |
[C 언어] 포인터변수, &주소연산자, * 간접연산자 (0) | 2021.09.29 |