728x90
- 이중 포인터란 포인터 변수의 주소를 값으로 가지는 포인터 변수
- 함수에 이중포인터를 사용하는 이유
void lls_create_stack(linkedliststack** stack)
{
(*stack) = (linkedliststack*)malloc(sizeof(linkedliststack));
(*stack)->list = NULL;
(*stack)->top = NULL;
}
- stack은 linkedliststack 구조체를 가리키는 주소를 담은 포인터 변수의 주소를 담은 인자이다.
- 최초 선언 후 아직 위 함수를 거치지 않은 linkedliststack 구조체 자료형의 포인터 변수는 아무 주소도 가리키지 않는 초기값의 형태를 띄고 있다.
- 포인터 변수에게 새로운 스택 주소를 알려주기 위해선 주소를 할당해주어야한다.
- 여기서 우리는 malloc() 함수가 메모리 주소를 반환한다는 사실을 짚고 넘어가야한다.
- 만약 싱글 포인터를 사용해서 malloc()을 사용했을 경우를 생각해보자
- stack이라는 매개변수에 초기값을 가지고 있는 구조체의 포인터 변수가 복사되어 전달된다.
- 이 복사된 값은 지금부터 별개로 존재한다.
함수 안의 stack main의 stacklinkedliststack* stack = NULL; void lls_create_stack(linkedliststack* stack) 1번 { stack = (linkedliststack*)malloc(sizeof(linkedliststack)); 2번 stack->list = NULL; stack->top = NULL; } 3번
함수 매개변수가 가리키는 값 NULL NULL 1번 *stack의 의미 malloc이 반환한 새로운 메모리 주소 NULL 2번 함수 작동 후 코드 블록이 끝나서 메모리에서 사라짐 NULL 3번 - 그렇다면 이중 포인터를 사용하면 어떻게 될까
- stack이라는 매개변수에 초기값을 주소값으로 가지고 있는 포인터 변수의 주소를 가진 포인터 변수가 복사되어 전달된다.
- 이 복사된 값 또한 별개로 존재한다.
함수 안의 stack main의 stack의 값 변화linkedliststack* stack = NULL; void lls_create_stack(linkedliststack** stack) 1번 { (*stack) = (linkedliststack*)malloc(sizeof(linkedliststack)); 2번 (*stack)->list = NULL; (*stack)->top = NULL; } 3번
함수 매개변수가 가리키는 값 main에서 선언한 stack 포인터 변수의 주소 NULL 1번 *stack의 의미 malloc이 반환한 새로운 메모리 주소를 main에서 선언한 포인터 변수에 새로히 할당한다. 새로 할당된 malloc() 메모리주소 2번 함수 작동 후 코드 블록이 끝나서 메모리에서 사라짐 새로 할당된 malloc() 메모리 주소 3번 - 헷갈릴 수 있는 것
- main()에서 선언한 포인터 변수의 주소와 함수 내에서 매개변수로 쓰이는 변수의 주소는 다르다
- 단, 가리키고 있는 주소의 값은 복사하여서 사용하기에 같다
728x90
'[자료구조 & 알고리즘]' 카테고리의 다른 글
리스트 ADT / SLL / DLL / CDLL (0) | 2025.05.05 |
---|---|
[자료구조 & 알고리즘] C언어의 포인터(pointer), 구조체(structure), 힙(heap), 스택(stack) (1) | 2025.05.05 |