为什么有人需要一个指向指针的指针?
例如,为什么需要char **myVariable;
?如果一个指针只是内存中的一个地址,为什么如果它是一个指向指向char地址的指针的指针,而不仅仅是指向具有char的地址的指针,会产生什么区别呢?为什么有人需要一个指向指针的指针?
在组装这是不是可以像
LDR R3, =myVariable
LDR R2, =[R3]
LDR R1, =[R2]
LDR R0, =[R1]
如果一个指针是
LDR R1, =myVariable
LDR R0, =[R1]
现在R0
持有的价值?显然这种方法更快。
如果您想通过函数修改指针的值,您必须将该指针的地址传递给引用的函数。因此,您需要指针作为参数的指针。
例子:
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这是一个真实的现实生活中的例子,正确的答案之一。 – 2013-05-14 05:10:47
虽然参考对于这个目的会更好,因为我们正在讨论C++。 :P – cHao 2013-05-14 05:13:28
我会指出你通常可以使用对指针的引用来处理这种情况。当你想要容易地传递NULL来指示你*不关心那个输出值时,这个例外就是了。 – 2013-05-14 05:14:43
好吧,如果你有指针表的指针,指向该表将具有类型“指针指针”。
- 比方说,你有一个指针和指针的价值。例如,指针指向数组中的一个元素。然后你用这个指针调用一个函数,你的意思是它是一个输入/输出参数,所以函数会修改它。在这种情况下,通过在游戏中添加一个间接指针并将指针的指针传递给该函数,可以更改指针。
- @ Lindyracer's:指针数组。如果你掌握了一个“全局”指针,那么它使用一个双重间接(通常你将它作为typedef定义的类型)。其原因在于,如果你存储了双指针,那么内存管理器可以自由地改变该双指针指向的指针,所以它可以移动东西,碎片整理等。
有很多更多。
在C++中,您通常更喜欢为此目的提供参考。 – cHao 2013-05-14 05:10:02
这是正确的@cHao。在现代C++中,理想情况下不会看到太多**。 – 2013-05-14 05:17:11
当你想处理存储指针并处理它时需要指针指针;例如改变底层指针的内容。例如:
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
通过引用传递更容易打电话并增加一定程度的保护。然而,由于通过引用传递几乎不可避免地实现为通过指针,指针引用和指针指针在性能方面几乎是相同的。 – 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
'char ** argv' ...? – Mehrdad 2013-05-14 05:09:44
1)对于链接列表,其中一个函数正在分配2)当你有一个空字符串数组? – 2013-05-14 05:10:21
天真的问题。 – 2013-05-14 05:41:15