[정보처리기사] C언어 - 구조체, 포인터 구조체..
구조체란?
여러 변수들을 모아서, 하나의 객체를 구성할 때 사용하는 사용자 정의 타입의 객체
구조체의 구성
struct 구조체명 {
변수1;
변수2;
};
ex.
struct person {
char *name;
int age;
};
struct person user1; // person이라는 구조체에 user1로 name과 age 인자를 가진 구조체를 생성할 것
user1.name = "chassi";
printf("%s", user1.name);
구조체 정의 및 사용
struct person {
char *name;
int age;
} test; // test는 뒤이어 struct로 선언하지 않고 바로 생성 가능
test.name = "chassi"
test.age = 33;
printf("%s : %d", test.name, test.age);
포인터에 구조체를 만든다
struct person {
char *name;
int age;
};
struct person *p; // 포인터 변수를 생성
p -> name = "chassi"; // '->'를 사용하여 구조체를 형성하면 된다. , p->name을 하나의 변수로 볼 것
p -> age = 33; // p->age를 하나의 변수로 볼 것
printf("%s : %d", p->name, p->age);
ex.
#include<stdio.h>
int main() {
struct list {
int *fp;
} data, *p;
int x[] = {100,200, 300, 400};
p = &data;
p->fp = x+1;
printf("%d", *(++p->fp));
return 0;
}
해설
struct list {
int *fp; // 포인터 변수는 정수형태로 주소를 받는다.
} data, *p; //정의 하지 않고 바로 생성했기 때문에, 각각 *fp를 가진다. (위에 정의 없이 사용하는 구조체처럼)
아래처럼 구조체가 생긴다고 생각하시면 됩니다
int x[] = {100,200, 300, 400};
x | 임의의주소 10번지 | 11번지 | 12번지 | 13번지 |
10번지 | 100 | 200 | 300 | 400 |
p = &data;
- p는 data가 가지는 주소를 할당 받는다.
- data의 주소가 500번지라고 가정하고, p는 600번지라고 가정하면
- p는 주소를 받는데 그 값이 data의 주소이므로 data의 주소를 참조하게 된다.
즉,
- p의 포인터 변수에 들어가는 fp라는 구조는 사라지고 data의 주소인 500번지를 참조하게 된다.
(아래 그림 참조)
p->fp = x+1;
1. 'p->fp'를 하나의 변수로 생각할 것
2. '해석은 p가 가르키는 공간 fp에'
p는 위에서 data의 주소를 할당 받고 있고, 그 공간에 fp를 할당하는데, 그 값이 x+1
x가 10번지이므로 x+1은 11번지가 fp에 들어가게 된다.
printf("%d", *(++p->fp));
1. p->fp를 하나의 변수로 생각하고,
2. 굳이 괄호로 구역을 나눠보면 *(++(p->fp))로 생각하면 된다.
즉,
1. p->fp는 먼저 ++되니까 11->12
2. *(12)는 12번지의 값이니까 300이 출력
정답은 300