struct 구조체이름 {
    자료형 멤버이름;
};

struct 구조체이름 {
    자료형 멤버이름;
} 변수;


struct Person {    // 구조체 정의
    char name[20];        // 구조체 멤버 1
    int age;              // 구조체 멤버 2
    char address[100];    // 구조체 멤버 3
};

#include <stdio.h>

void  main(void)
{
	struct Person p1;    // 구조체 변수 선언
    
    // 점으로 구조체 멤버에 접근하여 값 할당
	strcpy(p1.name, "kiki");
	p1.age = 1000;
	strcpy(p1.address, "올로로로");

	// 점으로 구조체 멤버에 접근하여 값 출력
	printf("이름: %s\n", p1.name);       // 이름: kiki
	printf("나이: %d\n", p1.age);        // 나이: 1000
	printf("주소: %s\n", p1.address);    // 주소: 올로로로
}
typedef struct 구조체이름 {
    자료형 멤버이름;
} 구조체별칭;

//typedef는 자료형의 별칭을 만드는 기능, 구조체 포함 모든 자료형의 별칭 가능
typedef struct {          // 구조체 이름이 없는 익명 구조체
    char name[20];        // 구조체 멤버 1
    int age;              // 구조체 멤버 2
    char address[100];    // 구조체 멤버 3
} Person;         		  // typedef를 사용하여 구조체 별칭을 Person으로 정의

 

 

구조체 포인터

  • struct 구조체이름 *포인터이름 = malloc(sizeof(struct 구조체이름));
    struct Person {    // 구조체 정의
        char name[20];        // 구조체 멤버 1
        int age;              // 구조체 멤버 2
        char address[100];    // 구조체 멤버 3
    };
    
    void main(void)
    {
    	struct Person *p1 = malloc(sizeof(struct Person));    // 구조체 포인터 선언, 메모리 할당
        
        // 화살표 연산자로 구조체 멤버에 접근하여 값 할당
        strcpy(p1->name, "kikiki");
        p1->age = 100;
        
        // 화살표 연산자로 구조체 멤버에 접근하여 값 출력
        printf("이름: %s\n", p1->name);       // kikiki
        printf("나이: %d\n", p1->age);     
        
        free(p1);    // 동적 메모리 해제
    }

 

구조체의 멤버에 접근하는 방법

 . (점)을 사용해서 멤버에 접근했지만 구조체 포인터의 멤버에 접근할 때는 -> (화살표 연산자 : arrow operator)를 사용

p1->age;      // 화살표 연산자로 멤버에 접근
(*p1).age;    // 구조체 포인터를 역참조한 뒤 .으로 멤버에 접근

// (*p1).age와 같이 구조체 포인터를 역참조하면 
// pointer to struct Person에서 pointer to가 제거되서 struct Person이 됨

 

구조체의 멤버가 포인터일 때 역참조

구조체의 멤버가 포인터일 때 역참조를 하려면 맨 앞에 *를 붙임

이때 구조체 변수 앞에 *가 붙어있더라도 멤버의 역참조이지 구조체 변수의 역참조가 아님

  • *구조체변수.멤버
  • *구조체포인터->멤버

https://dojang.io/mod/page/view.php?id=418 

 

C 언어 코딩 도장: 49.1 구조체 포인터를 선언하고 메모리 할당하기

49 구조체 포인터 사용하기 보통 구조체는 멤버 변수가 여러 개 들어있어서 크기가 큰 편입니다. 그래서 구조체 변수를 일일이 선언해서 사용하는 것보다는 포인터에 메모리를 할당해서 사용하

dojang.io

 

'1 > C' 카테고리의 다른 글

가변 인수  (0) 2021.10.10
strdup substr memmove strlcpy strlcat  (0) 2021.07.03
parameter / argument  (0) 2021.06.19
size_t / ssize_t  (0) 2021.06.10
파일 입출력 관련 함수 | open() close() read() lseek()  (0) 2021.06.07

+ Recent posts