8.6 구조체 포인터 변수     [gdoc]     [smts]

 구조체 변수도 포인터로 선언할 수 있으며 문법은 기본 자료형의 경우와 동일하다.


Point *pa;

이렇게 선언하면 pa는 Point 구조체 포인터 변수이다. 구조체 포인터는 미리 정의된 Point 변수를 이용하여 초기화할 수 있다.


Point a = {0, 1};
Point *pa = &a;

또는 malloc()함수를 이용하여 메모리를 할당할 수도 있다.


Point *pa = malloc(sizeof(Point);


포인터 변수의 경우 필드는 다음과 같이 ‘->’ 연산자를 사용하여 접근할 수 있다.


pa->x = 0;
pa->y = 1;

즉, 구조체 포인터의 접근자는 점(.)이 아니라 ‘->’ 이다.


0806-01.c

#include <stdio.h>
#include <stdlib.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point a = {11,12};
   Point *pa = &a;
   
   pa->x = 11.5;
   pa->y = 12.6;
   
   Point *pb = malloc(sizeof(Point));
   pb->x = 13;
   pb->y = 14;
   
   printf("a.x=%lf, a.y=%lf\n", a.x, a.y);
   printf("pa->x=%lf, pa->y=%lf\n", pa->x, pa->y);
   printf("pb->x=%lf, pb->y=%lf\n", pb->x, pb->y);
   
   free(pb);
}

a.x=11.500000, a.y=12.600000
pa->x=11.500000, pa->y=12.600000
pb->x=13.000000, pb->y=14.000000

이 예에서 pa는 a로 초기화 시켰다. 따라서 pa->x 와 pa->y 는 a.x와 a.y는 서로 동일한 데이터이며 한 쪽을 변경하면 다른 쪽도 자동으로 변경된다. 그리고 pb는 별도의 메모리를 malloc() 함수를 이용하여  할당시켰다. 이 경우 반드시 free()함수를 이용하여 사용한 메모리를 반환해야 한다.


 함수로 구조체 변수를 넘길 때 복사본이 넘어가는 것은 기본 자료형과 같다. 따라서 어떤 함수에서 넘겨받은 구조체 변수의 필드를 변경하는 것은 원래 변수에 아무런 영향을 미치지 않는다.


0806-02.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

void showInfo(Point a) {
printf("(%f, %f)", a.x, a.y);
}

void changeToOrigin(Point a) {
a.x = 0;
a.y = 0;
}

int main(int argc, char **argv) {
Point a = {11,12};
printf("a:(%.2f, %.2f)\n", a.x, a.y);
changeToOrigin(a);
printf("a:(%.2f, %.2f)\n", a.x, a.y);
}

실행 결과

a:(11.00, 12.00)
a:(11.00, 12.00)

위 예에서 changeToOrigin()함수를 호출할 때 Point 변수 a를 넘기고 이것이 함수 내부에서 원점으로 변경되었지만 원래 변수에는 전혀 영향을 미치지 않느다. 왜냐면 구조체 변수의 복사본이 함수로 넘어가기 때문이다.


 하지만 함수로 포인터를 넘기면 원래 구조체 필드를 직접 접근할 수 있다.


0806-03.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

void showInfo(Point a) {
printf("(%f, %f)", a.x, a.y);
}

void changeToOrigin(Point *a) {
a->x = 0;
a->y = 0;
}

int main(int argc, char **argv) {
Point a = {11,12};
printf("a:(%.2f, %.2f)\n", a.x, a.y);
changeToOrigin(&a); //<- 포인터를 넘긴다.
printf("a:(%.2f, %.2f)\n", a.x, a.y);
}

실행 결과

a:(11.00, 12.00)
a:(0.00, 0.00)

위에서는 changeToOrigin()함수가 Point형 포인터를 받아서 필드를 변경한다. 호출하는 쪽에서도 a변수의 포인터(&a)를 넘겨준다. 이러면 changeToOrigin()함수 내부에서 원본을 변경할 수 있다. 실행 결과에서 보면 변수 a의 필드들이 변경되었음을 알 수 있다.

'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

6장 연습문제  (0) 2016.05.30
3장 연습문제 풀이 동영상  (0) 2016.04.18
8.5 구조체 배열  (0) 2016.04.15
8.4 구조체를 필드로 가지는 구조체  (0) 2016.04.15
8.3 구조체를 함수의 인자로 넘기기  (0) 2016.04.15
Posted by 살레시오
,