iOS/정보처리기사

[정보처리기사] C언어 - 구조체, 포인터 구조체..

Chafle 2022. 6. 17. 19:08
반응형
구조체란?

 

여러 변수들을 모아서, 하나의 객체를 구성할 때 사용하는 사용자 정의 타입의 객체

 

 

 

구조체의 구성

 

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

반응형