9

存储指针地址需要什么?

  int a = 2;
  int *p = &a;
  int **q = &p;

有什么实际用途吗?实时应用。

4

5 回答 5

23

在 C 中,您可以传递对象的“值”或“地址”。如果您在函数调用中传递值,则函数中所做的更改不会反映在调用位置。为了反映变化,您需要传递对象的地址,例如:

void insert(node* head){
   head->data = 10;    // address(or head) is still same 
}

对象 I 表示任何类型的 int、char 或 struct,例如节点

在上面的示例中,您通过head指针更改值,并且data将反映更改。

但是假设如果你想head在你的列表中改变自己(例如插入新节点作为第一个节点)。

void insert(node* head){
   head = malloc(sizeof(head));  // head changed 
   head->data = 10;
}

然后值不会反映在调用位置,因为head函数中的 this 与head调用位置不同。

你有两个选择,要么return head使用pointer to pointer(但记住只能返回一个值)。

使用指向指针的指针:

void insert(node** head){
   (*head) = malloc(sizeof **head);   
   (*head)->data = 10;
}

现在变化将反映出来!

关键是,如果地址是您的值(需要更新地址),那么您需要使用地址指针,或者我应该说指针指针来反映调用位置的更改。

由于您的问题是指针指针的需要,在string 数组动态二维数组中使用指针指针的另一个地方,并且对于相同的用途,您可能需要指针指针,例如String 的动态矩阵或/ 3D 字符数组

另请阅读:Pointers to Pointers I just found,举个例子。

于 2013-08-19T05:41:32.363 回答
11

A**只是一个指向指针的指针。因此,其中 an*p包含 an 的地址,p其中包含 an 的地址p**,该地址p*包含p对象的地址。

**当您想要在函数调用之外保留内存分配或分配时使用。

还要检查这篇文章

例子:-

void allocate(int** p)
{
  *p = (int*)malloc(sizeof(int));
}

int main()
{
  int* p = NULL;
  allocate(&p);
  *p = 1;
  free(p);
}
于 2013-08-19T05:35:35.703 回答
4

int main (int argc, char** argv) { ... }

看起来熟悉?

于 2013-08-19T16:18:49.063 回答
3

如果要在其他函数中分配第 N 阶指针,则应使用 (N+1) 阶指针。例如:

void allocate_matrix(int ***ptr, int x, int y);

让我们分配一个矩阵:

int **matrix:
allocate_matrix(&matrix, 5, 5);
于 2013-08-19T06:56:18.643 回答
1

这样做的一个用途是从函数内更改指针的值。例如:

#include <stdio.h>

void swapStrings(const char **strA, const char **strB)
{
    const char *tmp = *strB;
    *strB = *strA;
    *strA = tmp;
}

int main()
{
    const char *a;
    const char *b;
    a = "hello";
    b = "world";
    swapStrings(&a,&b);
    // now b points to "hello" and a points to "world"
    printf("%s\n", a);
    printf("%s\n", b);
}

输出:

world
hello
于 2013-08-19T05:40:53.510 回答