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언어