gpt4 book ai didi

C - 大括号和双指针内的指针

转载 作者:太空宇宙 更新时间:2023-11-04 06:48:23 28 4
gpt4 key购买 nike

我目前正在学习一些关于基本数据结构的东西并完成 C 语言的练习。这个实验正在研究双向链表,这是要追加的基本函数。数据结构对我来说很有意义,但我对代码感到困惑。为什么这里有一个指向列表的双指针 (**) 而不是只有一个 * 是合适的。还有为什么 (*list) 在括号里?

我一直在研究指针并浏览教程。我明白指针的意思,但我不确定为什么双指针在这里是合适的。

void append(struct node ** list, int num,)
{
struct node *temp, *current = *list;
if(*list == NULL)
{
*list = (struct node *) malloc(sizeof(struct node));
(*list) -> prev = NULL;
(*list) -> data = num;
(*list) -> next = NULL;
}
else
{
while(current -> next != NULL)
{
current = current -> next;
}

temp = (struct node *) malloc(sizeof(struct node));
temp -> data = num;
temp -> next = NULL;
temp -> prev = current;
current -> next = temp;
}
}

这里为您提供有关该结构的信息是它的属性:

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

最佳答案

Why is it appropriate here to have a double pointer (**) to the list rather than just the one *

因为我们要更改指针值并将其返回给调用者。和你一样:

void f(int *x) {
*x = 5;
}

int y;
f(&y);
printf("%d\n", y); // will print 5

和你一样

static int x_mem = 5;
void f(int **x) {
// x is a pointer to (pointer to int)
*x = &x_mem;
}

int *y; // pointer to int
f(&y);
printf("%d %p %p\n", **y, (void*)y, (void*)&x_mem); // will print 5 and two same addresses of `x_mem` variable.

在您的函数中,如果列表头为空,则为其分配内存。您需要将该指针返回给调用者,以便调用者知道列表头从哪里开始。所以你这样做:

*list = (struct node *) malloc(sizeof(struct node));

Also why is (*list) in brackets?

因为 -> 先求值,然后是 *。这意味着:

*a->b

解析为:

*(a->b)

即:

struct A_s {
int *m;
};
struct A_s *a = malloc(sizeof(struct A_s));
a->m = malloc(sizeof(int));
*a->m = 5;

但是你想首先取消引用指针并访问底层结构。即你有:

struct A_s a_mem;
struct A_s *a = &a_mem;
struct A_s **b = &a;
(*b)->m = malloc(sizeof(int)); // equivalent to `a->m` or `(*a).m` or `(**b).m`
*(*b)->m = 5; // equivalent to `*((*b)->m) = ` or `*(a->m) = ` or `*a->m`

关于C - 大括号和双指针内的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54852562/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com