[C 기초 - 구조체 포인터]

Junyeong Fred Kim·2021년 12월 6일
0

C언어

목록 보기
19/21

구조체 포인터


포인터는 어떤 변수의 주소를 담아서 가리키는 변수이다. 구조체 포인터는 구조체를 가리키는 포인터를 구조체 포인터라고 한다.


int형 포인터는 int*ptr;형식으로 선언했다.
구조체는 struct [구조체 이름]이 자료형이나 마찬가지이다.
따라서 struct student *ptr;과 같이 선언해야 한다.


ptr은 구조체를 가리키는 포인터일 뿐 절대 구조체가 아니다.

#include <stdio.h>

typedef struct {
	int s_id;
	int age;
} Student;

int main(){
	Student goorm;
	Student *ptr;
	
	ptr = &goorm;
	
	(*ptr).s_id = 1004;
	(*ptr).age = 20;
	
	printf("goorm의 학번 : %d, 나이: %d\n", goorm.s_id, goorm.age);
}

출력

goorm의 학번 : 1004, 나이: 20

출력 설명

구조체 포인터를 사용하기 위해서는 항상 괄호를 사용해야 한다.
그래서 ->라는 기호를 사용하면 괄호를 사용하지 않아도 알아서 주소로 찾아가서 구조체를 참조한다.

->를 사용한 코드

#include <stdio.h>

typedef struct {
    int s_id;
    int age;
} Student;

int main(){
    Student goorm;
    Student *ptr;
    
    ptr = &goorm;
    
    (*ptr).s_id = 1004;
    ptr->age = 20;
    
    printf("goorm의 학번 : %d, 나이: %d\n", goorm.s_id, goorm.age);
}

출력

goorm의 학번 : 1004, 나이: 20

출력 설명

괄호를 이용한 것과 마찬가지로 정상적으로 값이 대입된다.


중첩 구조체


구조체 안에 구조체를 선언할 수 있다.

#include <stdio.h>

typedef struct {
	char name[15];
	int age;
} Teacher;

typedef struct {
	char name[15];
	int age;
	Teacher teacher; 
} Student;

int main(){
	Student Student;
	Teacher Teacher;
	
	Student.teacher.age = 30;
	Teacher.age = 40;
	
	return 0;
}

코드 설명

이런 식으로 다른 구조체를 멤버로 포함할 수 있다. 이럴 경우, Student안의 Teacher 구조체를 이용하고 싶으면, Student.teacher.age와 같이 연속으로 멤버를 참조해야 사용할 수 있다. 물론 Teacher 구조체만 사용할 수도 있다.

자기 참조 구조체


구조체는 자기 자신을 참조하도록 자기와 똑같은 타입의 구조체를 멤버로 가질 수 있다.

typedef struct {
	char name[15];
	int age;
	struct Student *ptr; 
} Student;

구조체에서는 위와 같이 자기 자신을 가리키는 포인터를 멤버로 가질 수 있다.
이렇게 자기 참조 구조체는 연결 리스트트리를 만들 때 사용된다.

profile
기억보다 기록

0개의 댓글