본문 바로가기

C언어

11-2강 구조체 포인터

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

 

1. 구조체 포인터 기본

1) 동적 메모리 할당

1> 구조체 포인터를 선언

2> 그 구조체의 크기만큼 malloc 함수로 메모리를 할당 

struct '구조체이름'* '구조체 포인터 이름' = malloc(sizeof(struct '구조체 이름'));

 

2) 구조체 멤버에 접근

1> .(점)이 아닌 ->(화살표 연산자)를 이용

2> 예시

'구조체 포인터 이름'->'구조체 멤버'

3> .(점)으로 접근하는 방법

(*'구조체 포인터 이름').'구조체 멤버'

 

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

// 1. 구조체 포인터 (선언 및 메모리 할당)
struct Person *p1 = malloc(sizeof(struct Person));  

// 2. 멤버에 접근
strcpy(p1->name, "홍길동");
p1->age = 30;

 

3) 구조체의 멤버가 포인터일 때

1> *(역참조 연산자)를 사용한다.

2> 포인터인 멤버의 역참조이지 구조체 변수의 역참조가 아닙니다.

struct Data {
    char c1;
    int *numPtr;    // 포인터
};

int main()
{
    int num1 = 10;
    struct Data d1;    // 구조체 변수
    struct Data *d2 = malloc(sizeof(struct Data));    // 구조체 포인터에 메모리 할당

    d1.numPtr = &num1;
    d2->numPtr = &num1;

    printf("%d\n", *d1.numPtr);     // 10: 구조체의 멤버를 역참조
    printf("%d\n", *d2->numPtr);    // 10: 구조체 포인터의 멤버를 역참조

    d2->c1 = 'a';
    printf("%c\n", (*d2).c1);      //  a: 구조체 포인터를 역참조하여 c1에 접근
                                   // d2->c1과 같음
    printf("%d\n", *(*d2).numPtr); // 10: 구조체 포인터를 역참조하여 numPtr에 접근한 뒤 다시 역참조
                                   // *d2->numPtr과 같음
    free(d2);
    return 0;
}

 



 

2. typedef와 구조체 포인터

1) 동적 메모리 할당

1> 이번에도 'struct 구조체 이름' 부분을 '구조체 별칭'으로 대체한다.

'구조체 별칭'* '구조체 포인터 이름' = malloc(sizeof(struct '구조체 이름'));

 

2) 구조체 멤버에 접근

(이전 방법과 동일하다.)

1> .(점)이 아닌 ->(화살표 연산자)를 이용

2> 예시

'구조체 포인터 이름'->'구조체 멤버'

3> .(점)으로 접근하는 방법

(*'구조체 포인터 이름').'구조체 멤버'

 

// 0. 구조체 정의
typedef struct _Person {    // 구조체 이름은 _Person
    char name[20];             // 구조체 멤버 1
    int age;                   // 구조체 멤버 2
} Person; 

// 1. 구조체 포인터 (선언 및 메모리 할당)
Person *p1 = malloc(sizeof(Person));

// 2. 멤버 접근
strcpy(p1->name, "홍길동");
p1->age = 30;

(익명 구조체도 '2. typedef' 와 동일하게 사용합니다.) 

 

 

 

cf> 동적 메모리 할당 이외의 방법도 활용해본다. 

구조체 포인터에 바로 구조체 변수의 주소를 할당한다.

 



 

3. 구조체 포인터에 구조체 변수의 주소 할당

0) 사전 작업

1> 구조체 정의

2> 구조체 변수, 구조체 포인터 선언

 

1) 구조체 포인터에 구조체 변수의 메모리 주소 할당

'구조체 포인터 이름' = &'구조체 변수'

 

2) 구조체 멤버에 접근

(이전 방법과 동일하다.)

1> .(점)이 아닌 ->(화살표 연산자)를 이용

2> 예시

'구조체 포인터 이름'->'구조체 멤버'

3> .(점)으로 접근하는 방법

(*'구조체 포인터 이름').'구조체 멤버'

 

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

int main()
{
// 0. 구조체 변수, 구조체 포인터 선언
    struct Person p1;      // 구조체 변수 선언
    struct Person *ptr;    // 구조체 포인터 선언
    
// 1. 구조체 포인터에 구조체 변수의 메모리 주소 할당
    ptr = &p1;    // p1의 메모리 주소를 구하여 ptr에 할당

// 2. 구조체 멤버 접근
    ptr->age = 30;

    printf("나이: %d\n", p1.age);      // 나이: 30: 구조체 변수의 멤버 값 출력
    printf("나이: %d\n", ptr->age);    // 나이: 30: 구조체 포인터의 멤버 값 출력

    return 0;
}

'C언어' 카테고리의 다른 글

11-1강 - 구조체 기본  (0) 2020.04.09
9강 - Pointer Application  (0) 2020.03.31
3강 - 함수 (function)  (0) 2020.03.02
2강 - structure of a C program  (0) 2020.03.02
1강 - Introduction to C  (0) 2020.03.02