gpt4 book ai didi

c - 为什么在使用动态数据类型时必须返回指针? (即堆栈、列表、队列、动态数组)

转载 作者:行者123 更新时间:2023-11-30 16:23:05 26 4
gpt4 key购买 nike

当使用pop和push函数时,我必须返回一个指针,否则变量堆栈不会改变。有谁知道为什么吗?

#include <stdio.h>
#include <stdlib.h>

//Defining stack element
typedef struct element
{
int num; //Content of the element
struct element *next; //Pointer to the next element
}element;

element *push(element *s, int x); //Insert x elements in the stack
void print(element *s); //Prints the stack's elements
element *pop(element *s); //Removes the stack's top element

int main()
{
element *stack = NULL; //Pointer to the stack's top element
int x;

printf("Insert the number of elements: ");
scanf("%d", &x);

stack = push(stack, x);
print(stack);

stack = pop(stack);
print(stack);

return 0;
}

element *push(element *s, int x)
{
element *newElement;

for(; x > 0; x--)
{
newElement = (element*)malloc(sizeof(element));

printf("Number: ");
scanf("%d", &newElement->num);

newElement->next = s;
s = newElement;
}

return s;
}

void print(element *s)
{
element *through = s;

printf("Your stack:\n");

while(through != NULL)
{
printf("%d\t", through->num);
through = through->next;
}
printf("\n");
}

element *pop(element *s)
{
element *elementDeleted = s;
s = elementDeleted->next;

printf("Element deleted: %d\n", elementDeleted->num);

free(elementDeleted);
elementDeleted = NULL;

return s;
}

我只是希望修改函数中的指针堆栈,因此我希望函数为空。但实际上,如果我不返回指针,堆栈变量将保持其起始值(在本例中为 NULL)。

最佳答案

您需要在函数参数中使用双指针:

// Add a new value to the top of the stack
void push(element **s, const int x);
// Print the stack
void print(const element *s);
// Try removing the top element of the stack and returning it
int pop(element **s);

然后,您可以使用对堆栈指针的引用来调用 pushpop:

push(&stack, x);
pop(&stack);

然后,如果你想修改指向堆栈的指针,你可以取消引用s一次:*s = newElement,但如果你想获取顶部元素,您取消引用它两次:const int num = (*s)->num;

需要这样做的原因是,当您将指向堆栈的指针传递给函数时,该函数会收到该指针的副本。这个新指针引用同一个堆栈,因此修改堆栈中的值会起作用,但修改指针本身不会在函数外部执行任何操作。

如果您使用指向堆栈的指针,则允许修改第二个指针,因为只有顶级指针是副本。

关于c - 为什么在使用动态数据类型时必须返回指针? (即堆栈、列表、队列、动态数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54127058/

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