C 中指向结构的指针与指向数组的指针

Pointers to structs in C vs pointers to arrays

C 中指向结构的指针与其他指针的工作方式是否不同? 例如在这段代码中:

typedef struct node {
    int data;
    struct node *next;
} node;

void insert(node **head, int data) {
    node *new_node = malloc(sizeof(node));
    new_node->data = data;
    new_node->next = *head;
    *head = new_node;
}

int main() {
    node *head = NULL;
    insert(&head, 6);

为什么我必须使用指向指针的指针,而不能像本例中的数组那样在 insert 函数中使用变量 head

void moidify(int *arr) {
    *arr = 3;
}

int main() {
    int *array = malloc(8);
    *array = 1;
    *(array + 1) = 2;
    moidify(array);
}

这里我不用传&array给函数

没有区别。如果要更改发送到 function 的变量的值,使更改在调用 function 的函数中可见,则需要将其地址提供给 function,这就是您在获取 head.

地址时所做的事情

moidify(array) 中,您发送指向 array 中第一个元素的指针,这就是修改数组数据有效的原因。如果您想修改 array 变量本身(通过使其可能指向其他地方),您也必须获取它的地址。示例:

void moidify(int **arr) {
    *arr = realloc(*arr, 128);
    if(*arr == NULL) {
        perror(__func__);
        exit(1);
    }
}

int main() {
    int *array = malloc(8);
    *array = 1;
    *(array + 1) = 2;
    moidify(&array);
}

你必须了解指针的工作原理才能得到这个。 在这里,变量 array 不是正确的说法,一个数组。它是指向大小为 8 * sizeof(int) 的内存 space 的指针。它只包含一个地址。从这个地址你可以访问数组的值,你使用这个地址移动到你想要填充或读取的正确内存space。

明白这一点后,当您调用 moidify 函数时,您并没有传递数组。也不是内存 space。你传递的是内存地址space。该函数在参数变量 int *arr.

中获取给定地址的副本

因此,您可以像在 main 函数中一样使用它。

如果您想更改 array 变量的地址,您需要向接收函数指定 &array,然后接收函数将使用 int ** 参数变量。

你的 struct 示例与我刚才描述的最后一部分类似,你想改变 head 指向的地址,所以你需要给函数 &head 。获取head的地址,并能修改包含的地址。

你使用一个地址,来访问内存space叫head,修改内存space里面的地址叫head,它指向另一个内存space,您的结构真正属于的地方。