일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 백준 21606번
- 위상 정렬(Topological Sort)
- BFS(Breadth First Search)
- 그리디 알고리즘(Greedy Algorithm)
- 큐(Queue)
- 백준 10000번
- 이분 탐색(Binary Search)
- 백준 17608번
- DFS
- 백준 9012번
- 위상 정렬(Topology Sort)
- 분할 정복(Divide and Conquer)
- 백준 1948번
- 백준 2812번
- DFS & BFS
- 트리(Tree)
- 이분 그래프(Bipartite Graph)
- 스택(Stack)
- 백준 2493번
- 백준 1707번
- BFS
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 백준 18352번
- 알고리즘 개념
- DFS(Depth First Search)
- 그래프(Graph)
- 동적 프로그래밍(Dynamic Programming)
- 백준 2504번
- 백준 2261번
- Today
- Total
Always Be Wise
구조체 포인터 본문
포인터는 어떤 변수의 주소를 담어서 가리키는 변수를 의미한다. 구조체 포인터도 크게 다르지 않다. 구조체를 가리키는 포인터를
구조체 포인터라고 한다. 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 |