有人可以解释指针指针的工作原理吗?

acc*_*511 2 c malloc struct pointers

我真的不明白指针指针是如何工作的.没有使用指针指针的任何方式做同样的工作?

struct customer
{
    char name[20];
    char surname[20];
    int code;
    float money;
};
typedef struct customer customer;
void inserts(customer **tmp)
{
    *tmp = (customer *)malloc(sizeof(customer));
    puts("Give me a customer name, surname code and money");
    scanf("%s %s %d %f", (*tmp)->name, (*tmp)->surname, &(*tmp)->code, &(*tmp)->money);
}
Run Code Online (Sandbox Code Playgroud)

Mah*_*mer 8

指针指针101

让我们说你有一个int变量x:int x;.

  • 一部分内存将被分配给大小足以容纳`int`的`x`.
  • 分配给`x`的内存在进程内存映射中有一个地址.
  • 要查看`x`位于内存中的地址,请使用:
    x
  • `&x`表示`x`的地址.
  • 要查看存储在`x`中的整数值,请使用:
    int
  • `x` 只能在其存在的范围内直接操作.例如,它可以在声明它的函数内操作:
    x
  • 在其存在的范围之外,如果知道"内存地址",则可以操纵"x"的值.
  • 如果将`x`(即:42)的值传递给function(x),则该函数不能操作`x`的值.
  • 如果将`x`的地址传递给function(printf("x's memory address = %p\n", (void*)&x);),该函数可以操作`x`的值.

现在,假设您有一个指针变量&x,假定它指向x:x

  • 一部分内存将被分配给足够大的"p"来保存内存地址.
  • 分配给"p"的存储器在进程存储器映射中具有一个地址.
  • `&p`表示`p的地址.
  • 要查看`p`位于内存中的地址,请使用:
    printf("x=%d\n", x);
  • 要查看`p`指向的地址,请使用:
    x
  • 要查看指向的所谓整数,请使用:
    x = 42;
  • `p`的值是内存中的地址; 并且`p`可以设置为指向任何地址,无论该地址是否实际存在于进程内存映射中.
  • 对象的地址是指向该对象的指针.因此,要使`p`指向`x`:
    x
  • 无论`p`指向什么都可以通过指针类型引用(对于`p`类型为int).
  • 分配给"p"的内存量会有所不同,具体取决于机器的体系结构; 以及它如何代表一个地址.
  • `p` 只能在其存在的范围内直接操作.例如,它可以在声明它的函数内操作:
    x或x
  • 在其存在的范围之外,如果知道"内存地址",则可以操纵"p"的值.
  • 如果将`p`(地址)的值传递给function(x),则该函数不能操纵'p'来改变它指向的位置.
  • 如果将`p`的地址传递给function(x),那么该函数可以操作`p`指向的内容.

现在,假设你有一个指向指针变量的指针&x,它指向一个指向'int'的指针:x ...或:void inserts(customer **tmp):

  • 指针的地址是指针的指针.
  • ...

在此输入图像描述

回到问题

问:没有使用指向指针的方法可以做同样的工作吗?

不.假设如下:

void inserts(customer **tmp);

...
   {
   customer cust;
   custPtr  custPtr = &cust;

   inserts(&custPtr);
   ... 
Run Code Online (Sandbox Code Playgroud)

该p函数需要指针的地址才能操纵int点的位置.

如果相反:

void inserts2(customer *tmp);

...
   {
   customer cust;
   custPtr  custPtr = &cust;

   inserts2(custPtr);
   ... 
Run Code Online (Sandbox Code Playgroud)

在int *p;将得到的值的副本p,这是地址p.因此,&p可以修改值address of,但不能改变p指向的位置.