例如,为什么需要char **myVariable;
?如果一个指针只是内存中的一个地址,那么如果它指向一个指向地址的地址的指针,而不只是一个指向带有char的地址的指针,它会产生什么区别?
在装配中不会像
那样LDR R3, =myVariable
LDR R2, =[R3]
LDR R1, =[R2]
LDR R0, =[R1]
单个指针的位置
LDR R1, =myVariable
LDR R0, =[R1]
现在R0
是否拥有该值?显然这种方式更快。</ p>
答案 0 :(得分:10)
如果您想通过函数修改指针的值,则必须通过引用将该指针的地址传递给函数。因此,您需要指针指针作为参数。
示例:
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 :(得分: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)
还有更多。
答案 6 :(得分:0)
首先,因为完成语言在语义上是可行且必要的,所以没有任何未定义的区域表示这个表达式是什么意思,&p
其中p
是指针?
它看起来也很方便。以下是Linus Torvalds的答案。 Using pointers to remove item from singly-linked list