第一种和第二种情况有什么区别?

时间:2014-08-07 16:50:27

标签: c

第一种情况和第二种情况有什么区别,为什么第一种情况按预期工作,而第二种情况不适用? (在第二种情况下,我试图引入一个指针来取消引用指针的指针,以避免输入额外的星号)。

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;
}

3 个答案:

答案 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; 
}