3

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

在装配中这不就像

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

单个指针的位置

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

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

4

7 回答 7

11

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

例子 :

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;
}
于 2013-05-14T05:07:40.353 回答
10

好吧,如果您有一个指针表,则指向该表的指针将具有“指向指针的指针”类型。

于 2013-05-14T05:08:43.410 回答
3
int main ( int argc, char **argv )

一个字符串数组。

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

于 2013-05-14T05:34:24.263 回答
2

上面的回复已经解决了您问题的第一部分。回答第二部分“如果它是指向带有指向 char 的地址的指针的地址的指针与指向带有 char 的地址的指针有什么区别?”

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

于 2013-05-14T05:31:31.200 回答
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++ 中,您有更好的选择作为"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
于 2013-05-14T05:10:50.937 回答
0
  1. 假设您有一个指针,并且指针的值很重要。例如,指针指向数组中的一个元素。然后你用那个指针调用一个函数,你的意思是它作为一个输入/输出参数,所以函数会修改它。在这种情况下,可以通过在游戏中再增加一个间接性并将指针的指针传递给函数,这样它就可以更改指针。
  2. @Lindyracer's:指针数组。
  3. 在某些操作系统中,如果您获得“全局”指针,则它使用双重间接(通常您将其作为由 typedef 定义的类型)。这背后的原因是,如果您存储双指针,则内存管理器可以自由更改该双指针指向的指针,因此它可以移动事物,进行碎片整理等。

还有很多。

于 2013-05-14T05:08:43.410 回答
0

首先,因为完成语言在语义上是可能的和必要的,所以对于这个表达式的含义没有未定义的领域,指针&p在哪里?p

而且它看起来也很方便。这是 Linus Torvalds 的回答。 使用指针从单链表中删除项目

于 2013-05-14T05:45:03.613 回答