연결리스트

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’