为什么有人需要指针指针?

时间:2013-05-14 05:05:19

标签: c++ pointers assembly

例如,为什么需要char **myVariable;?如果一个指针只是内存中的一个地址,那么如果它指向一个指向地址的地址的指针,而不只是一个指向带有char的地址的指针,它会产生什么区别?

在装配中不会像

那样
LDR R3, =myVariable
LDR R2, =[R3]
LDR R1, =[R2]
LDR R0, =[R1]

单个指针的位置

LDR R1, =myVariable
LDR R0, =[R1]

现在R0是否拥有该值?显然这种方式更快。<​​/ p>

7 个答案:

答案 0 :(得分:10)

如果您想通过函数修改指针的值,则必须通过引用将该指针的地址传递给函数。因此,您需要指针指针作为参数。

示例:

int main()
{
  int num=0;
  int *p = &num;
  // This function passes the pointer by value. 
  //So when function returns, *p points to same place
  fn(p);

  // This function will actually change where the pointer points to as 
  // it was passed by reference
  fn2(&p);
}
void fn(int *ptr)
{
    static int i=1;
    ptr = &i;
}
void fn2(int **ptr)
{
    static int j=1;
    *ptr = &j;
}

答案 1 :(得分:10)

好吧,如果你有一个指针表,那么指向该表的指针就会有“指向指针”的类型。

答案 2 :(得分:3)

int main ( int argc, char **argv )

字符串数组。

当然它比较慢,你在中间有额外的步骤,但没有那个额外的步骤你不能有一个数组/表/指针列表。你只有一个。

答案 3 :(得分:2)

上面的回复已经解决了问题的第一部分。回答第二部分 “如果它是指向带有指向char地址的指针的地址的指针,而不仅仅是指向带有char的地址的指针,它会有什么不同?”

虽然在内存布局方面,你所说的是对的,C / C ++根据其类型处理指针。 当你执行指针++时,它会按指针指向的数据类型的大小递增指针。 如果它是一个指向整数的指针,它将增加4,如果它是一个指向字符的指针,它将增加1,如果它是一个指向大小为20的结构的指针,它将增加20。 p>

答案 4 :(得分:1)

当你想要处理存储指针并处理指针时,需要指针指针;例如更改基础指针的内容。例如:

int i = 0, j = 1;
int* p = &i;
int** pp = &p;

现在你想让p指向j而不是i,然后你可以这样做:

*pp = &j;  // equivalent to `p = &j;`

这只是为了解释。在现实世界中,当您处理函数时,这是必需的。

void Destroy (int** pp) {  // for any int pointer
  delete[] pp;  // deallocate the memory
  *pp = 0;  // set the pointer to 0, so that it's not dangling
}

并将其用作:

int* pi = new int[30];
...
Destroy(&pi); // `pi` is now pointing to 0

但仍然在C ++中,你有“指针引用”的优越选择。哪个大致相同,但具有更好的可读性。

void Destroy (int*& p) {  // for any `int` pointer 
  delete[] p;  // destroy the memory
  p = 0;  // Null out the same pointer which was actually passed
}

用作:

Destroy(pi);  // no need to pass address

答案 5 :(得分:0)

  1. 假设你有一个指针,指针的值很重要。例如,指针指向数组中的元素。然后用一个指针调用一个函数,你的意思是它作为一个输入/输出参数,所以函数会修改它。在这种情况下,可以通过在游戏中添加一个间接并将指针的指针传递给函数来实现,这样就可以更改指针。
  2. @ Lindyracer's:指针数组。
  3. 在某些操作系统中,如果你得到一个“全局”指针,那么它使用双重间接(通常你将它作为typedef定义的类型)。这背后的原因是,如果你存储双指针,那么内存管理器可以自由地改变该双指针指向的指针,因此它可以移动东西,并进行碎片整理等。
  4. 还有更多。

答案 6 :(得分:0)

首先,因为完成语言在语义上是可行且必要的,所以没有任何未定义的区域表示这个表达式是什么意思,&p其中p是指针?

它看起来也很方便。以下是Linus Torvalds的答案。 Using pointers to remove item from singly-linked list