Always Be Wise

구조체 포인터 본문

프로그래밍 언어/C

구조체 포인터

bewisesh91 2021. 12. 4. 15:15
728x90

포인터는 어떤 변수의 주소를 담어서 가리키는 변수를 의미한다. 구조체 포인터도 크게 다르지 않다. 구조체를 가리키는 포인터를

구조체 포인터라고 한다. int *ptr 형식으로 int형 포인터를 선언하였듯이 구조체는 struct student *ptr과 같이 선언하면 된다.

아래 코드는 typedef를 사용해서 보다 간결히 구조체 포인터를 구현하였다.

#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);
}

구조체 포인터를 이용해서 값을 대입하고 이용할 때 주의해야할 점은 포인터를 사용할 때 *ptr.age가 아닌 (*ptr).age와 같이 괄호를

이용해야 한다는 것이다. 온점도 연산자의 일종으로 *ptr.age라고 작성하면 구조체가 아닌 포인터 변수를 참조하려고 하기 때문에

오류가 발생한다. 이렇게 괄호를 이용하는 것이 불편하다면 ->라는 기호를 이용할 수도 있다. 이 기호를 이용하면 괄호를 사용하지

않아도 알아서 주소를 찾아가서 구조체를 참조한다. 

#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);
}

구조체는 구조체 안에 구조체를 선언할 수 있다. 이를 중첩 구조체라고 한다. 아래 코드와 같이 다른 구조체를 멤버로 포함할 수 있다.

Student안의 Teacher 구조체를 이용하고 싶으면 Student.teacher.age와 같이 연속으로 멤버를 참조하면 된다. 

#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;
}

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

아래 코드에서와 같이 포인터를 멤버로 가질 수 있는 경우를 의미하는데, 이는 연결 리스트나 트리를 만들 때 사용된다.

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

구조체를 인자로 전달할 때에는 포인터로 전달하는 것과 구조체 그대로 전달하는 것 두 가지 방법이 있다. 그러나 구조체의 경우 담고

있는 자료형들이 많을 경우 복사할 공간이 많이 필요하게 된다. 따라서 메모리 낭비를 줄이기 위해 매개변수로 구조체를 전달할 때에는

보통 포인터를 사용한다. 

#include <stdio.h>

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

void print_student(Student *s){
	s->s_id = 2000;
	s->age = 25;
	
	printf("학번 : %d, 나이 : %d\n", s->s_id, s->age);
}

int main(){
	Student s;

	s.s_id = 1000;
	s.age = 20;
	
	print_student(&s);
    
	printf("학번 : %d, 나이: %d\n", s.s_id, s.age);
}

'프로그래밍 언어 > C' 카테고리의 다른 글

Keywords와 Identifiers  (0) 2021.12.06
메모리 구조와 동적 메모리 할당  (0) 2021.12.04
구조체 배열  (0) 2021.12.04
typedef를 이용한 구조체 선언  (0) 2021.12.04
구조체란?  (0) 2021.12.04
Comments