C언어 - 구조체의 기본적인 사용법
2020. 11. 14. 17:44ㆍ개인공부/C언어
서로 다른 자료형인 배열들을 내가 원하는 형태로 가져와서 쓸수없을까? = 구조체
struct가 마치 자료형인것처럼 변수를 선언한다.
이름 배열, 키 배열, 몸무게 배열, 나이 배열
.(dot) 도 연산자이다 (구조체 멤버에 접근할수 있는 구조체 연산자이다.)
역시 변수를 선언 할때 메모리를 가진다. (위의 모양과 같이)
구조체의 형태대로 틀에짜여 나오게 된다. (보통 붕어빵에 비유해서 말함, 서양에선 쿠키틀에 비교)
struct person //Person is a tag of structure
{
char name[MAX]; // member
int age; // member
float height; // member
};
// 구조체가 선언 될때 메모리를 가짐
// 위는 틀을 짠것뿐 아직 메모리를 받은게 아님
int main{
int flag;
//구조체 변수 사용하는 방법
struct person genie; // 위의 name age height가 genie가 선언될때 메모리 받음
strcpy(genie.name, "Will Smith");
genie.age = 1000;
// person 이라는 구조체의 age 변수
// .이 &보다 우선순위가 높다.
flag = scanf("%f", &genie.height); &(genie.height) 와 같다.
printf("%\n", genie.height);
struct person princess = { "Naomi Scott", 18, 160.0f};
// 배열처럼 원소를 나열한다.
// 하지만 배열은 같은 데이터 타입이고 구조체는 다양한 타입이 가능하다.
// 선언하는 순서랑 초기화 해주는 순서랑 같아야함.
strcpy(princess.name, "Naomi scott");
princess.age = 18;
princess.height = 160.0f
// Designated initializers 지정된 초기화
struct person beauty = {
.age = 19,
.name = "Bell",
.height = 150.0f
};
// 위의 구조체(지정된 초기화)는 순서를 바꿀수있다.
// 구조체 변수를 위한 포인터
struct person* someone;
someone = &genie;
someone->age - 1001; // arrow operator
printf("%s %d\n", someone->name, (*someone).age);
struct book
{
char farm[MAX];
float price;
} apple, apple2; // 직접 struct variable을 선언할수 있다.
strcpy(apple.farm, "trade joe");
apple.price = 1.2f;
strcpy(apple2.farm, "trade joe");
apple.price = 1.2f;
typedef struct person my_person;
// 마치 my_person이라는 자료형이 있는 것처럼 선언할수 있음
my_person p3;
typedef struct person person;
person p4;
typedef struct { // tag가 없다
char name[MAX];
char hobby[MAX];
} friend;
friend f4;
return 0;
}
int main(){
struct Alligned{
int a;
float b;
double c;
};
struct Aligned a1, a2;
a1과 a1.a의 주소가 같다
a2와 a2.a의 주소가 같다.
struct Padded1
{
char a;
float b;
double c;
// 1 + 4 + 8 사이즈라 총 13이 나와야 하는데 a+b+c size가 16이 나온다.
};
struct Padded p1;
//char 1바이트에 안쓰는 공간을 억지로 넣어 4바이트로 만듬.
//padding은 Struct Member Alignment이다.
// 데이터를 묶어서 x64에서는 8바이트씩, x86에서는 4바이트씩 묶어 나른다.
// 고로 칸을 맞춰주기 위해 char을 4바이트로 만든다.
// |a|float b| double c | ???
// float a; double b; char c; 는 24바이트다.. 엄청난 낭비 double이 안잘리게 하기 위해
// float와 char 에 빈공간을 채워 8바이트가 되게 만들었기 때문이다..
struct Person f[4];
// |f[0].name | f[0].age | f[0].height | ... ... | f[3].name |f[3].age| ..
}
출처 : 홍정모의 따라배우는 C언어
'개인공부 > C언어' 카테고리의 다른 글
C언어 - 구조체를 함수로 전달하는 방법 (0) | 2020.11.15 |
---|---|
C언어 - 구조체를 다른 구조체의 멤버로 사용하기 (0) | 2020.11.15 |
C언어 - 파일 입출력 (0) | 2020.11.13 |
C언어 - 멀티쓰레딩 (Multi - Threading) (0) | 2020.11.13 |
C언어 - 동적 할당 메모리와 저장 공간 분류 (0) | 2020.11.13 |