구조체
구조체를 사용하면 여러 가지 변수들을 하나로 묶는 것이 가능하다.
예를 들어 30명의 학생들의 5가지 신상정보를 기록하려고 할 때 150가지 변수를 선언할 필요가 없게 되는 것이다.
구조체를 선언하는 방법은 아래 코드와 같다.
struct Information
{
char name[20];
int age;
int stdID;
char gender;
char address[100];
};
구조체 변수를 사용하려면 구조체를 선언한 후에 구조체 변수도 선언해주어야 한다.
구조체 변수는 'struct 타입이름 변수이름;' 의 형태로 선언할 수 있다.
구조체 변수를 선언한 후에는 연산자 . 을 통해 접근할 수 있다.
초기화를 할 때에는 배열에 넣을 때와 마찬가지로 중괄호 안에 데이터를 넣고 쉼표를 사용하여 구분해주면된다.
위 코드를 응용하여 구조체 변수를 하나 만들어보겠다.
#include <stdio.h>
#pragma warning(disable:4996)
struct Information
{
char name[20];
int age;
int stdID;
char gender;
char address[100];
};
int main ()
{
struct Information stdinfo = {"Enchupin", 23, 20210001, 'M', "서울특별시 xxxx..."};
printf("%s\n", stdinfo.name);
printf("%d\n", stdinfo.age);
printf("%d\n", stdinfo.stdID);
printf("%c\n", stdinfo.gender);
printf("%s", stdinfo.address);
return 0;
}
위 코드를 실행시켜보면 입력한 값이 그대로 출력되는 것을 확인할 수 있다.
구조체 배열
구조체 하나를 선언하고 해당 구조체로 여러 개의 구조체 변수를 선언할 수도 있다.
#include <stdio.h>
#pragma warning(disable:4996)
struct Information
{
char name[20];
int age;
int stdID;
char gender;
char address[100];
};
int main ()
{
struct Information stdinfo1;
struct Information stdinfo2;
struct Information stdinfo3;
return 0;
}
그러나 위 코드처럼 작성할 경우 구조체 변수를 작성하는 의미가 줄어든다.
이럴 때에는 구조체 변수를 배열로 선언할 수도 있다.
#include <stdio.h>
#pragma warning(disable:4996)
struct Information
{
char name[20];
int age;
int stdID;
char gender;
char address[100];
};
int main ()
{
struct Information stdinfo[30];
int i;
for (i=0;i<30;i++)
{
scanf("%s\n", stdinfo[i].name);
scanf("%d\n", &stdinfo[i].age);
scanf("%d\n", &stdinfo[i].stdID);
scanf("%c\n", &stdinfo[i].gender);
scanf("%s", stdinfo[i].address);
printf("\n%s\n", stdinfo[i].name);
printf("%d\n", stdinfo[i].age);
printf("%d\n", stdinfo[i].stdID);
printf("%c\n", stdinfo[i].gender);
printf("%s\n\n", stdinfo[i].address);
}
return 0;
}
위 코드처럼 작성하면 150개의 변수 선언을 6개로 줄일 수 있게 된다.
구조체 배열을 초기화 할 때에는 다차원배열을 초기화하는 것처럼 중괄호를 중첩해서 사용하면 된다.
예시로 아래 코드처럼 사용할 수 있다.
struct PhoneNumber
{
char name[20];
int age;
char gender;
}
int main ()
{
struct Information stdinfo[3] = {{"김씨", 20, 'F'}, {"박씨", 21, 'F'}, {"정씨", 22, 'M'}};
.... }
구조체 포인터
구조체 변수를 포인터로 선언할 수도 있다.
선언하는 방법은 포인터를 선언할 때와 마찬가지로 변수명과 자료형 사이에 애스터리스크를 넣어주면 된다.
구조체 포인터 변수를 역참조하는 방법은 . 연산자와 애스터리스크를 사용하는 방법도 있지만
화살표 연산자를 사용하는 방법도 있다.
예시로 구조체 포인터 변수를 선언하고 역참조하는 코드를 작성해 보겠다.
#include <stdio.h>
#include <stdlib.h>
struct Person {
int ID;
int age;
};
int main ()
{
struct Person *a1 = malloc(sizeof(struct Person));
(*a1).ID = 1234;
a1->age = 23;
printf("id : %d\n", a1->ID);
printf("age : %d", (*a1).age);
}
위 코드를 실행하면 입력한 ID와 나이가 정상적으로 출력되는 것을 알 수 있다.
구조체 변수의 주소값
구조체 변수의 주소값은 배열과 마찬가지로 첫 번째 멤버(데이터)의 주소값과 동일하다.
이 내용은 아래 코드로 확인이 가능하다.
#include <stdio.h>
struct Pos {
float x;
float y;
};
int main()
{
struct Pos Apos;
struct Pos Bpos;
printf("%p %p %p\n", &Apos, &Apos.x, &Apos.y);
printf("%p %p %p\n", &Bpos, &Bpos.x, &Bpos.y);
return 0;
}
'C언어 > C언어 문법' 카테고리의 다른 글
[C언어] 함수로의 구조체 변수 전달과 구조체 반환 함수 (0) | 2024.02.24 |
---|---|
[C언어] 사용자 정의 자료형(typedef), 구조체 typedef 선언 (0) | 2024.02.23 |
[C언어] 버퍼(Buffer), 입출력버퍼 비우기(fflush) (0) | 2024.02.22 |
[C언어] 파일 입출력 함수 (fputc, fputs, fgetc, fgets, putchar, getchar, puts, gets) (0) | 2024.02.21 |
[C언어] 스트림(Stream), EOF (0) | 2024.02.20 |