为什么有人需要一个指向指针的指针?

问题描述:

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

在组装这是不是可以像

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

如果一个指针是

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

现在R0持有的价值?显然这种方法更快。

+7

'char ** argv' ...? – Mehrdad 2013-05-14 05:09:44

+1

1)对于链接列表,其中一个函数正在分配2)当你有一个空字符串数组? – 2013-05-14 05:10:21

+2

天真的问题。 – 2013-05-14 05:41:15

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

例子:

int main() 
{ 
    int num=0; 
    int *p = # 
    // 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

+1这是一个真实的现实生活中的例子,正确的答案之一。 – 2013-05-14 05:10:47

+5

虽然参考对于这个目的会更好,因为我们正在讨论C++。 :P – cHao 2013-05-14 05:13:28

+0

我会指出你通常可以使用对指针的引用来处理这种情况。当你想要容易地传递NULL来指示你*不关心那个输出值时,这个例外就是了。 – 2013-05-14 05:14:43

好吧,如果你有指针表的指针,指向该表将具有类型“指针指针”。

  1. 比方说,你有一个指针和指针的价值。例如,指针指向数组中的一个元素。然后你用这个指针调用一个函数,你的意思是它是一个输入/输出参数,所以函数会修改它。在这种情况下,通过在游戏中添加一个间接指针并将指针的指针传递给该函数,可以更改指针。
  2. @ Lindyracer's:指针数组。如果你掌握了一个“全局”指针,那么它使用一个双重间接(通常你将它作为typedef定义的类型)。其原因在于,如果你存储了双指针,那么内存管理器可以*地改变该双指针指向的指针,所以它可以移动东西,碎片整理等。

有很多更多。

+0

在C++中,您通常更喜欢为此目的提供参考。 – cHao 2013-05-14 05:10:02

+0

这是正确的@cHao。在现代C++中,理想情况下不会看到太多**。 – 2013-05-14 05:17:11

当你想处理存储指针并处理它时需要指针指针;例如改变底层指针的内容。例如:

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

现在你想pj,而不是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 
+1

通过引用传递更容易打电话并增加一定程度的保护。然而,由于通过引用传递几乎不可避免地实现为通过指针,指针引用和指针指针在性能方面几乎是相同的。 – 2013-05-14 05:33:26

回帖有解决您的问题的第一部分。第二部分回答第 “如果它是指向指向char地址的指针的指针,而不是指向具有char的地址的指针,它会产生什么区别?”

尽管在内存布局方面,您所说的是正确的,C/C++根据其类型处理指针。 当您执行指针++时,它会按指向它的数据类型的大小递增指针。 如果它是一个指向一个整数的指针,它将被增加4,如果它是一个指向字符的指针,它将会加1,如果它是一个指向一个20号结构的指针,它将会加20。

int main (int argc, char **argv) 

一串字符串。

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

首先,因为它在语义上是可能的并且是必要的,所以完成该语言,不留下任何未定义的区域来表示这个表达式的含义,&p其中p是一个指针?

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