전 시간에 구조체 포인터에 대해 배웠다.
그렇다면 구조체 포인터 변수를 선언할 때 그 구조체 안에 포인터가 있다면?? 굉장히 복잡하지 않을까? 뭔 소린지 모르겠을 것이다. 맞다 그냥 코드를 보자.
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;
}
포인터 참조의 논리적 구조를 표현하면 밑의 그림처럼 된다.
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 28강) 공용체 (0) | 2020.11.16 |
---|---|
C언어 27강)++ &연산자로 구조체(struct)포인터에 구조체 변수 할당하기 (0) | 2020.11.16 |
C언어 27강) 구조체(struct) 포인터 기본 (0) | 2020.11.15 |
C언어 26강) 구조체(struct) 기본개념 및 초기화 (0) | 2020.11.15 |
C언어 25강-1) 문자열 비교하기 strcmp 함수 (0) | 2020.11.14 |