이중 포인터 매개변수 사용 원리가
이중 포인터를 선언하고 역참조 후 malloc 함수로 메모리를 할당 후
단일 포인터를 선언 후 메모리 주소를 구하고 size와 함께 이걸 함수에 넣어주는 방식이 맞습니까?
그리고 단일 포인터의 메모리 주소는 이중포인터와 왜 같은지도 알고 싶습니다
함수 안에 메모리를 할당해도 벗어나면 왜 사용불가이지도 알고 싶습니다 지역 변수도 그런 원리 인건가요?
단일 포인터의 메모리 주소는 왜 이중포인터와 같나요?
코드 없이 문장만 있어서 의미는 잘 모르겠습니다만,
포인터가 중요한 게 아니라 함수에 선언된 타입에 맞춰서 함수를 호출하는 게 중요합니다.
이중 포인터이든, 삼중 포인터이든 아무 상관 없습니다.
함수의 인자가 int를 원하면 int를 전달하고, int*을 원하면 int*을 전달해야 합니다. 하필 선언한 변수가 int a라면 &a로 주소로 변환해서 int*을 원하는 함수의 타입에 맞춰주는 것이겠지요.
포인터가 중요한 게 아니라 타입을 맞춰주는 게 더 중요합니다.
함수가 int **을 원하면 int **에 맞춰줘야 하는 것이고, int* a로 선언된 변수라면 &a로 넘겨서 int **에 맞춰주는 것 뿐입니다.
pointer는 address이므로
int *a가 pointer to int이고, &a는 address of pointer to int가 되므로
int **을 원한다면 pointer to pointer to int와 조건이 맞춰지는 것입니다.
물론, int a로 선언된 변수를 &&a로 한다면 동작하지 않습니다.
address of address of int이면 address of (address of int)에서 앞의 address of는 실체가 없으니까요.
#include <stdio.h> #include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일 void allocMemory(void **ptr, int size) // 반환값 없음, void 이중 포인터 매개변수 지정 { *ptr = malloc(size); // void **ptr을 역참조하여 void *ptr에 메모리 할당 } int main() { long long *numPtr; // 단일 포인터 long long *numPtr의 메모리 주소는 long long **와 같음, 할당할 크기도 넣음 allocMemory((void**)&numPtr, sizeof(long long)); *numPtr = 10; printf("%lld\n", *numPtr); free(numPtr); // 동적 메모리 해제 return 0; }제가 말하던게 이 코드를 의미 하는건데 혹시 제가 한 동작 원리가 맞나요?
이중 포인터 매개변수 사용 원리가
이중 포인터를 선언하고 역참조 후 malloc 함수로 메모리를 할당 후
단일 포인터를 선언 후 메모리 주소를 구하고 size와 함께 이걸 함수에 넣어주는 방식이 맞습니까?
이 문장이 여전히 이해가 안 되는 데요.
void allocMemory(void **ptr, int size) // 반환값 없음, void 이중 포인터 매개변수 지정 { *ptr = malloc(size); // void **ptr을 역참조하여 void *ptr에 메모리 할당 }코드로 설명을 하자면
void *ptr에 메모리를 할당하는 겁니다. 다만, 함수로 포인터를 전달 받으려면 주솟값이 필요합니다.
long long *numPtr; // 단일 포인터 long long *numPtr의 메모리 주소는 long long **와 같음, 할당할 크기도 넣음 allocMemory((void**)&numPtr, sizeof(long long));호출하는 쪽의 코드를 보면 *numPtr에 메모리를 할당하고 싶은 것이죠. 포인터에 메모리를 할당하려고 하니까 포인터의 주솟값이 필요합니다. 그래서 allocMemory를 호출할 때 &numPtr로 주솟값을 지정한 겁니다.
address of pointer to long long이 되겠죠.
이걸 받을 수 있는 건 pointer to pointer to long long이니까 long long **입니다.
void allocMemory(void **ptr, int size)void로 되어 있으니 (void**)로 형변환을 해서 호출하고 있는 겁니다.
allocMemory에서 void **ptr이 아니라 long long **ptr로 선언할 수 있지만, 그러면 특정 타입에 대해서만 호출할 수 있는 함수가 되니까 그렇게 안 하는 겁니다. void *는 범용 포인터(general pointer)라고 합니다.
pointer to X를 인자로 전달하려면 주솟값으로 전달해야 하니까 &X로 호출하는 겁니다.
pointer to X를 인자로 받아야 하니까 **X처럼 pointer to pointer to X가 되는 겁니다.
그리고 함수가 받아서 처리하려는 건 pointer to X이니까 앞에 붙은 주솟값을 떼고 역참조를 해야죠. 그래서 함수 안에서는 *X라고 쓰는 겁니다.
(1) 이중 포인터를 선언하고 역참조 후 malloc 함수로 메모리를 할당 후
포인터를 받으려니 이중 포인터를 선언했고, 역참조해서 malloc 함수로 메모리를 할당하는 것은 맞죠.
(2) 단일 포인터를 선언 후 메모리 주소를 구하고 size와 함께 이걸 함수에 넣어주는 방식이 맞습니까?
이것도 맞아요. 그런데 코드의 동작 순서는 (2) -> (1)입니다.
그리고 단일 포인터의 메모리 주소는 이중포인터와 왜 같은지도 알고 싶습니다
단일 포인터의 메모리 주소는
address of pointer to X이고
이중 포인터는
pointer to pointer to X입니다.
pointer는 주소이므로 address와 호환됩니다.
같은 게 아니라 호환되는 겁니다.
함수 안에 메모리를 할당해도 벗어나면 왜 사용불가이지도 알고 싶습니다 지역 변수도 그런 원리 인건가요?