C 포인터-> 함수형 인삼 int*p와 int**p의 차이
void fun(int * p) ;
int * pBuf = NULL; //****************(1)
fun(pBuf); //****************(2)
void fun(int * p) //****************(3)
{
p = (int*)malloc(10*sizeof(int)); //****************(4)
}
각 행 코드에서 수행되는 작업을 분석해 보겠습니다.
(1)에서 pBuf는 int* 유형이고 int 유형을 가리킵니다.이 때 pBuf는 바늘로 값이 있고 메모리 주소가 있습니다. (만약 0x00007fff5fbff620). 그러나 그 가리키는 메모리는 빈 NULL입니다.
(2)(3)에서 pBuf는 실참으로 함수fun(int*p)에 전달됩니다(p는 형참이고 이 때 p는 int*형식으로 int유형을 가리킵니다).p=pBuf, 0x00007fff5fbff620, 같은 주소.
(4)에서malloc는 메모리를 신청하고 이 메모리를 가리키는 주소를 되돌려주며 p를 주었다. 이때 p는malloc가 신청한 메모리를 가리켰다. p는 새로운 주소가 생겼다. pBuf와 더 이상 같지 않고 0x00007fff5fbff620이 아니다.이때 pBuf는 변하지 않고 0x00007fff5fbff620이다.
이 모든 방법은 pBuf에 대해 아무것도 바뀌지 않고 NULL을 가리킨다.그러나 pBuf는 메모리 주소가 있는 (초기화할 때부터 있는 것)인데 NULL을 가리킨다. 즉, 메모리를 열지 않았기 때문에 pBuf에 값을 부여할 수 없다. 왜냐하면 메모리 값이 없기 때문이다.
또 다른 방법을 살펴보자.
void fun(int ** p) ;
int * pBuf = NULL; //****************(1)
fun(&pBuf); //****************(2)
void fun(int ** p) //****************(3)
{
*p = (int*)malloc(10*sizeof(int)); //****************(4)
}
위의 각 행 코드에서 어떤 일이 일어났는지 똑같이 분석해 봅시다.
(1)에서 첫 번째 코드와 별 차이가 없다.가령: pBuf=0x00007fff5fbff620, &pBuf=0x00007fffaaae0f70, *pBuf=NULL.
(2)(3)에서 &pBuf는 실참으로 함수fun(int**p)에 전달되고(p는 형참이며 이 때 p는 int** 유형, 즉 바늘의 지침), p=&pBuf(0x00007fffaaae0f70).int* 유형을 가리키고 바늘을 가리키는데 이 바늘은 사실 pBuf, 즉 p가 pBuf를 가리키기 때문에 *p는 사실 pBuf(0x00007fff5fbff620)이다.0x00007fff5fbff620이 NULL을 가리키는 것을 잊지 마세요.
(4)에서malloc는 메모리를 신청하고 이 메모리를 가리키는 주소를 되돌려주며 *p를 주었습니다. 이때 *p는malloc가 신청한 메모리를 가리킵니다.이 때 p는 여전히 바뀌지 않았습니다. & pBuf와 같습니다. (0x00007fffaaae0f70). 그러나 p가 가리키는 주소는 바뀌었고 새 메모리를 가리켰습니다.그래서 0x00007fffaaae0f70은 새로운 메모리 주소를 가리키고 이 메모리 주소도 메모리를 가리키며 더 이상 NULL이 아니다.
총괄: 첫 번째 코드는 빈 메모리를 가리키는 주소를 전송했고 마지막에 인삼 p의 주소를 바꿨다. 전송된 pBuf와 더 이상 같지 않으며 pBuf에 대해 아무것도 바꾸지 않았다.두 번째 코드는 포인터 pBuf를 가리키는 포인터를 전송했고 마지막으로 p가 가리키는 주소를 바꿨다. p는 여전히 포인터 pBuf를 가리키는 포인터였다.마지막으로 전송된 바늘의 지향, 즉 &pBuf의 지향을 바꾸어 새로운 주소를 가리키게 했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.