例如,为什么需要char **myVariable;
?如果指针只是内存中的一个地址,为什么它是指向带有指向字符地址的指针的地址的指针而不是指向带有字符的地址的指针有什么区别?
在装配中这不就像
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;
}
好吧,如果您有一个指针表,则指向该表的指针将具有“指向指针的指针”类型。
int main ( int argc, char **argv )
一个字符串数组。
当然它更慢,你在中间有额外的步骤,但如果没有那个额外的步骤,你就不能有一个数组/表/指针列表。你只有一个。
上面的回复已经解决了您问题的第一部分。回答第二部分“如果它是指向带有指向 char 的地址的指针的地址的指针与指向带有 char 的地址的指针有什么区别?”
尽管就内存布局而言,您所说的是正确的,但 C/C++ 会根据指针的类型来处理指针。当您执行指针++时,它会按指针指向的数据类型的大小递增指针。如果它是一个指向整数的指针,它将增加 4,如果它是一个指向字符的指针,它将增加 1,如果它是一个指向大小为 20 的结构的指针,它将增加 20。
当您要处理存储指针并处理它时,需要指向指针的指针;例如更改底层指针的内容。例如:
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++ 中,您有更好的选择作为"pointer reference"。它的作用基本相同,但可读性更好。
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
还有很多。
首先,因为完成语言在语义上是可能的和必要的,所以对于这个表达式的含义没有未定义的领域,指针&p
在哪里?p
而且它看起来也很方便。这是 Linus Torvalds 的回答。 使用指针从单链表中删除项目