프로그래밍 언어/C
C언어 27강)+ 구조체(struct)의 멤버가 포인터 일 때, 구조체 포인터 변수 선언(동적메모리할당)
happy_life
2020. 11. 15. 22:36
전 시간에 구조체 포인터에 대해 배웠다.
C언어 27강) 구조체 포인터 기본
구조체 포인터 구조체를 가리키는 포인터로서 일반적인 포인터의 사용 방법이 비슷하지만, 구조체 멤버에 접근할 때는 '->'를 사용해야 한다 (*p1). name = p1 -> name ▲매번 *과 ( )를 사용하기 불편하
abcdefgh123123.tistory.com
그렇다면 구조체 포인터 변수를 선언할 때 그 구조체 안에 포인터가 있다면?? 굉장히 복잡하지 않을까? 뭔 소린지 모르겠을 것이다. 맞다 그냥 코드를 보자.
d2-> c = (*d2).c 라는 점과 포인터 변수의 개념 자체를 확실히 이해하고 있어야 밑의 코드를 이해할 수 있다.
●구조체 포인터변수 선언, 구조체 안에 포인터 변수가 있는 코드 예제
#include <stdio.h>
#include <stdlib.h>
struct Data {
char c;
int *numPtr; // 포인터
};
int main()
{
int num = 10;
struct Data d1; // 구조체 변수 선언
struct Data *d2 = malloc(sizeof(struct Data)); // 구조체 포인터 변수 선언 및 메모리 할당
d1.numPtr = # //구조체 d1의 멤버인 numPtr에 num의 메모리 주소를 전달
d2->numPtr = # //d2에 있는 Data의 메모리 주소를 역참조하여 멤버인 numPtr에 num의 메모리 주소 전달
printf("%d\n", *d1.numPtr); // 구조체의 멤버를 역참조
printf("%d\n", *d2->numPtr); // 구조체 포인터의 멤버를 역참조
// *d2->numPtr = *((*d2).numPtr)= *(numPtr)
d2->c = 'b'; //구조체 포인터 역참조하여 멤버 c에 접근해 b 값 넣기
printf("%c\n", (*d2).c); // b: 구조체 포인터를 역참조하여 c에 접근
// d2->c과 같음
printf("%d\n", *(*d2).numPtr); // 10: 구조체 포인터를 역참조하여 numPtr에 접근한 뒤 다시 역참조
// *d2->numPtr과 같음
free(d2);
return 0;
}
포인터 참조의 논리적 구조를 표현하면 밑의 그림처럼 된다.