반응형
구조체 포인터가 왜이렇게 헷갈릴까.
다시 복습.
- 포인터란 특정한 데이터가 저장된 주소값을 보관하는 변수
- 즉, 포인터도 변수다!
구조체 포인터도 마찬가지이다.
- 구조체를 가리키는 포인터를 구조체 포인터라고 한다.
- 즉, 구조체 포인터도 변수다!
int형 포인터는 int *ptr1; 형식으로 선언했다.
여기서, 구조체는 struct [구조체 이름]이 자료형이다.
struct [구조체 이름]형 포인터는 struct student *ptr2; 형식으로 선언했다.
여기서 struct가 있기 때문에 ptr2가 구조체라고 착각할 수 있지만 😵💫
ptr2는 구조체를 가리키는 포인터일 뿐 절대 구조체가 아니다. 💡💡💡💡💡💡💡
구조체를 가리키는 포인터로서 일반적인 포인터의 사용 방법이 비슷하지만, 구조체 멤버에 접근할 때는 '->'를 사용해야한다.
즉, '->' 화살표 연산자로 구조체 멤버에 접근할 수 있다.
그렇다면 구조체 포인터 변수를 선언할 때 그 구조체 안에 포인터가 있다면 ?? 😶🌫️
d2->c=(*d2).c 라는 점을 이해하고 있다면 이해할 수 있는 예제이다.
[구조체 포인터 변수 선언, 구조체 안에 포인터 변수가 있는 코드 예제]
#include <stdio.h>
#include <stdlib.h>
// 구조체의 정의(구조체 자료형 선언)
typedef struct Data{
char c;
int *numPtr; // 포인터
} Data;
int main(){
int num = 10;
Data d1; // 구조체 변수 선언
Data *d2 = malloc(sizeof(struct Data)); // 구조체 포인터 변수 선언 및 메모리 할당
d1.numPtr = # // 구조체 d1의 멤버인 numPtr에 num의 메모리 주소를 전달
d2->numPtr = # // d2에 있는 Data의 메모리 주소를 역참조하여 멤버인 numPtr에 num에 num의 메모리 주소 전달
printf("%d\n", *d1.numPtr); // 구조체의 멤버를 역참조
// *d1.numPtr == *(d1.numPtr)
printf("%d\n", *d2->numPtr); // 구조체 포인터의 멤버를 역참조
// *d2->numPtr == *(d2->numPtr)
// 출력결과
// 10
// 10
free(d2); // 동적 메모리 해제
return 0;
}
공부 참고
반응형
'SW사관학교 정글 > C언어와 친구들' 카테고리의 다른 글
[C언어와 친구들] int argc와 char *argv[]란? (2) | 2022.11.09 |
---|---|
[C언어와 친구들] 이진 탐색 트리 (BST) (0) | 2022.10.24 |
[C언어와 친구들] 구조체(Struct)와 연결리스트(Linked List) wow (4) | 2022.10.24 |
[C언어와 친구들] C언어의 *포인트는 포인터 (0) | 2022.10.24 |
[C언어와 친구들] 배열 .. 너 .. 포인터랑 뭐 있어? (0) | 2022.10.22 |