본문 바로가기

카테고리 없음

C언어 구조체 포인터

구조체에 포인터를 사용해서 맴버 변수에 접근하고 싶을 때 어떻게 하면 좋을까? 
구조체 변수를 일일이 선언해서 사용하는 것보다는 구조체 포인터를 선언하고  malloc함수를 사용해서 구조체 포인터에 동적 메모리를 할당한 다음 화살표 연산자나 -> .(점)을 사용해서  구조체 멤버의 값에 접근한다. 
 
구조체안에 있는 멤버 변수들
struct Data{
     char c1;
     int *numPtr;
};
 


1. 먼저 구조체 포인터를 선언하고 malloc 함수를 사용해 동적 메모리를 할당한다.
ex) struct Data *d2 = malloc(sizeof(struct Data));
 
 
2. 여기서 역참조 하는것에 괄호를 붙이면 구조체 포인터를 역참조한 뒤 .(점)을 사용하여  맴버에 접근할 수 있다.
ex) 구조체 포인터의 예
*(*d2).numPtr;
설명: d2의 구조체 포인터를 역참조 한 뒤  .(점)을 사용해 numPtr멤버 변수에 접근 뒤 *numPtr멤버 변수를 역참조

*(*d2).numPtr;


또 구조체 포인터에 괄호를 붙이고 .(점)을 사용하면 구조체 포인터가 일반변수로 바뀌게 된다.
ex) 구조체 포인터에서 일반변수로 바뀐 예시
(*d2).c1
설명: 괄호를 붙이고 점연산자를 사용하게 되면 d2의 구조체 포인터가 일반 변수로 바뀌게 되므로  바뀐 d2의 변수가 구조체 안에 있는 c1의 멤버 변수를 가리키게 된다. ( d1 -> c1 )

 


 

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

struct Data {
  char c1;
  int *numPtr; // 포인터 
};

int main() 
{
  int num1 = 10;
  struct Data d1; // 구조체 변수 
  struct Data *d2 = malloc(sizeof(struct Data)); // 구조체 포인터에 동적 메모리 할당 

  d1.numPtr = &num1;  
  d2->numPtr = &num1;  

  printf("%d\n", *d1.numPtr);  // 구조체변수에 numPtr맴버 변수를 역참조 , 결과는 10
  printf("%d\n", *d2->numPtr);  // 구조체 포인터의 맴버를 역참조 , 결과는 10

  d2->c1 = 'a';
  
 // 구조체 포인터로 역참조 뒤에 구조체 멤버변수 char c1 접근 
 // d2->c1이랑 같음
 // 값은 a
  printf("%c\n",(*d2).c1);  
  
  // 구조체 포인터로 역참조 뒤 구조체 안에 있는 numPtr변수에 접근한 뒤 다시 역참조
  // *d2->numPtr과 같다.
  // 값은 10
  printf("%d\n", *(*d2).numPtr); 


 // 마지막으로 구조체를 다 사용했으면 free함수로 d2메모리를 해제 
  free(d2);  

  return 0;
}