A. C언어에서 공용체union이나 구조체struct의 포인터 변수에서 해당 공용체나 구조체의 멤버 변수에 접근하고 싶을 때 사용한다.
포인터 변수가 가리키는 변수에 값을 할당하는 예
포인터 변수가 가리키는 변수에 값을 할당할 때 아래 예처럼 *포인터변수 형태로 한다.
#include <stdio.h>
int main() {
int num;
num = 4;
printf("%d\n", num);
int* numPointer;
numPointer = #
*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