언어 Language/C

Q. C언어에서 ->는 어떤 의미일까?

Tap to restart 2022. 11. 6. 14:00
반응형

A. C언어에서 공용체union이나 구조체struct의 포인터 변수에서 해당 공용체나 구조체의 멤버 변수에 접근하고 싶을 때 사용한다.

 

포인터 변수가 가리키는 변수에 값을 할당하는 예

포인터 변수가 가리키는 변수에 값을 할당할 때 아래 예처럼 *포인터변수 형태로 한다. 

#include <stdio.h>

int main() {
    int num;
    num = 4;
    printf("%d\n", num);
    int* numPointer;
    numPointer = &num;
    *numPointer = 5;
    printf("%d", num);
    return 0;
}

이 경우 *numPointer = 5;를 통해서 num에 5가 저장되게 된다.

 

출력 결과는

4
5

 

포인터 변수가 가리키는 공용체나 구조체에 값 할당

그렇다면 공용체나 구조체에서도 같은 식으로 하면 되지 않을까? 안 된다. 에러가 발생한다. 

 

예를 들어 아래와 같은 코드가 있다. 

#include <stdio.h>
#include <string.h>


struct person {
    int age;
    char name[20];
};

int main() {
    struct person john = {31, "John"};
    printf("=== person john ===\n");
    printf("%s\n", john.name);
    printf("%d\n", john.age);

    strcpy(john.name, "John Doe");
    john.age = 26;
    printf("%s\n", john.name);
    printf("%d\n", john.age);
    return 0;
}

 

이때 john.name, john.age로 값을 할당할 수도 있고, 값을 가져올 수도 있다.

이 john의 포인터 변수 jane을 만들고 *jane.age = 30; 이렇게 하면 될 거 같지만 안 된다. 

그렇다면 포인터 변수가 가리키는 구조체의 멤버 변수인 age 값을 바꾸고 싶다면 어떻게 해야할까?

이때 -> 를 사용한다. jane -> age = 30; 으로.

 

아래 코드를 실행해보자.

#include <stdio.h>
#include <string.h>


struct person {
    int age;
    char name[20];
};

int main() {
    struct person john = {31, "John"};
    printf("=== person john ===\n");
    printf("%s\n", john.name);
    printf("%d\n", john.age);
    printf("%p\n", &john);

    strcpy(john.name, "John Doe");
    john.age = 26;
    printf("%s\n", john.name);
    printf("%d\n", john.age);
    printf("%p\n", &john);

    struct person* jane = &john;
    strcpy(jane -> name, "Jane");
    jane -> age = 23;
    printf("=== person* jane ===\n");
    printf("%s\n", jane -> name);
    printf("%d\n", jane -> age);
    printf("%p\n", jane);
    return 0;
}

실행 결과 아래처럼 잘 할당된 것을 볼 수 있다.

 

참고할 문서

Pointers of Unions, gnu.org

Pointers of Structures, gnu.org

 

반응형