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,您的结构真正属于的地方。
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,您的结构真正属于的地方。