typedef struct s_list
{
char *content;
struct s_list *next;
} t_list;
t_list *head;
head = (t_list *)malloc(sizeof(t_list));
...
연결리스트는 위와 같은 구조체들이 연결되어 있는 것을 뜻합니다. 각 구조체마다 다음에 연결된 구조체의 주소를 next에 저장하고 있음으로써 서로 연결될 수 있습니다. 예를 들어 위와 같은 head를 생성한 뒤 그 뒤로 노드를 붙여나가면 아래와 같은 구조가 될 것입니다.
구조체 이름 | head | node1 | node2 | node3 | node4 |
---|---|---|---|---|---|
주소 | 0x00000000a | 0x00000000b | 0x00000000c | 0x00000000d | 0x00000000e |
content | “123” | “abc” | “a1c” | “2623” | “4242” |
next | 0x00000000b | 0x00000000c | 0x00000000d | 0x00000000e | NULL |
연결리스트의 끝은 해당 구조체의 next가 NULL 포인터를 가리킬 때 끝이라고 판단합니다.
이중포인터는 흔히 2차원 배열에서 많이 사용합니다. 일반 포인터를 먼저 살펴보면 쉽게 이해할 수 있습니다.
char *str = "abc";
변수 | str | str[0] | str[1] | str[2] | str[3] |
---|---|---|---|---|---|
주소 | 0x000000001 | 0x00000000q | 0x00000000w | 0x00000000e | 0x00000000r |
content | 0x00000000q | ‘a’ | ‘b’ | ‘c’ | 0 |
포인터는 주소를 가리키는 변수이기 때문에 str 자체에는 str[0]의 주소값이 들어가있습니다. 그래서 만약 *을 붙이게 되면 0x00000000q에 있는 값을 불러와서 ‘a’를 출력하게 될 것입니다.
이중포인터도 마찬가지로 해당 주소값에 있는 내용을 불러오게 되는데 다만 길을 한 번 더 가야 할 뿐입니다.
char alpha = 'a';
char **head;
char *route;
route = α
head = &route;
변수 | head | route | alpha |
---|---|---|---|
주소 | 0x000000001 | 0x00000000q | 0x00000000@ |
content | 0x00000000q | 0x00000000@ | ‘a’ |
즉, 아래와 같은 결과를 볼 수 있습니다.
route = 0x00000000@ ‘a’
head = 0x00000000q
*head = 0x00000000@ ‘a’