第一种情况和第二种情况有什么区别,为什么第一种情况按预期工作,而第二种情况不适用? (在第二种情况下,我试图引入一个指针来取消引用指针的指针,以避免输入额外的星号)。
int _tmain(int argc, _TCHAR* argv[])
{
int* test = NULL;
foo(&test);
}
案例1:
void foo(int** ppPar)
{
*ppPar = (int*)malloc(sizeof(int));
**ppPar = 7;
}
案例2:
void foo(int** ppPar)
{
int* pPar = *ppPar;
pPar = (int*)malloc(sizeof(int));
*pPar = 6;
}
答案 0 :(得分:6)
*ppPar = ...
这会重新指定main中的指针test
;
**ppPar = 7
这会更改main中test
指向的值。
int* pPar = *ppPar;
pPar =
这会生成main中指针test
的副本,然后重新分配副本。 (所以现在根本没有与test
的联系。
*pPar = 6;
这会更改pPar
指向的值,该值不再与test
相关联。
答案 1 :(得分:1)
让我们了解您的代码的主要概念,并简化它:
int *x = malloc(sizeof(int));
int y = *x;
y = 5;
在此代码中,相对清楚的是,虽然y
的值已更改,但*x
的值尚未更改。
在您的代码中,您为所有内容添加了额外的间接级别。这并没有改变我的观点的主旨:
int** ppPar = (something useful);
int* pPar = *ppPar;
pPar = (int*)malloc(sizeof(int));
同样,应该很清楚,虽然pPar
已发生变化,但*ppPar
却没有。
答案 2 :(得分:1)
在第二个示例中,您将本地指针pPar
分配两次:
void foo(int** ppPar)
{
int* pPar = *ppPar; /* 1st assigment */
pPar = (int*)malloc(sizeof(int)); /* 2nd assignment */
当第2个分配人员覆盖第1个分配的结果时,第1个分配显然是多余的,没用。
然后你将6
分配到已分配的内容
*pPar = 6;
但不要将引用返回给它。
要这样做,请添加
*ppPar = pPar;
}
最终代码可能如下所示:
void foo(int** ppPar)
{
int * pPar = malloc(sizeof(int));
/* of even better: int * pPar = malloc(sizeof(*pPar)); */
*pPar = 6;
*ppPar = pPar;
}