C中的堆栈数组实现-通过引用理解

用户6461080

因此,这是一个非常简单的堆栈实现(仅包含准系统推送弹出功能的数组)。我试图理解为什么将值推入数组后索引没有改变。我最初将itop变量放置在main中为“ int itop = 0”,但是由于itop值保持为0,我认为这可能是传递引用的问题,其中C取值的副本而没有t实际上会更改传入的值本身。因此,我想可以将它设为顶部的静态int(我知道这是不安全的,因为不安全的线程行为...),但是它仍然无法正常工作。

有人指出我要了解这个基本概念吗?谢谢

#include <stdio.h>

void push(int a[], int, int);
int pop(int a[], int);

static int itop = 0;

int main(void){
        int stack[100];
        push(stack, itop, 1);
        push(stack, itop, 2);
        printf("index is %d\n", itop);
        int p1 = pop(stack, itop);
        printf("index is %d\n", itop);
        int p2 = pop(stack, itop);
        int p3 = pop(stack, itop);
        printf("popped elements: %d %d %d\n", p1, p2, p3);
        return 0;
}

void push(int a[], int ind, int elem){
        a[ind++] = elem;
}

int pop(int a[], int ind){
        if (ind < 0){
                return -1;
        }
        else {
                return a[ind--];
        }
}
来自莫斯科的弗拉德

您没有通过itop引用传递变量您正在通过价值传递它。这两个函数都处理变量itop的副本,因此更改副本不会影响原始对象。

在C中通过引用传递意味着间接通过指针传递对象。

而且pop函数在这些语句中也有bug

if (ind < 0){
    ^^^^^^^

return a[ind--];
         ^^^^^

可以通过以下方式声明和定义函数

void push(int a[], int *ind, int elem){
        a[( *ind )++] = elem;
}

int pop(int a[], int *ind){
        if (*ind == 0){
                return -1;
        }
        else {
                return a[--*ind];
        }
}

请注意,一般而言,函数pop具有一个缺点,即不允许将-1存储在堆栈中,因为从函数返回的值-1是不明确的,并且可能意味着错误或堆栈的实际元素。

该功能可以通过以下方式定义

int pop( int a[], int *ind, int *value )
{
    int error = *ind == 0 ? -1 : 0;

    if ( error == 0 )
    {
        *value = a[--*ind];
    }

    return error;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C中通过引用传递多维数组

来自分类Dev

在C中通过引用传递数组

来自分类Dev

在C中通过引用传递多维数组

来自分类Dev

在C ++中通过引用传递数组

来自分类Dev

在C中通过引用传递数组

来自分类Dev

C中基于数组的堆栈实现

来自分类Dev

无法理解堆栈实现的isEmpty函数中的return语句

来自分类Dev

通过引用将堆栈分配的参数传递给数组

来自分类Dev

如何理解c ++函数中的返回引用?

来自分类Dev

在C ++中通过引用传递?

来自分类Dev

在C ++中实现堆栈

来自分类Dev

通过引用返回C ++

来自分类Dev

C ++通过引用问题

来自分类Dev

如何在C ++中通过引用传递数组元素?

来自分类Dev

在C中通过引用传递二维数组

来自分类Dev

通过引用处理C中的字符数组

来自分类Dev

通过C ++中的引用传递未签名的char数组

来自分类Dev

通过引用数组传递给C ++中的模板函数

来自分类Dev

在 C#3.5 中通过引用返回数组

来自分类Dev

如何在Dart中通过push和pop实现堆栈

来自分类Dev

通过引用传递数组并修改值C ++

来自分类Dev

C ++通过引用传递位域数组

来自分类Dev

C ++如何通过引用函数传递数组

来自分类Dev

通过引用修改数组

来自分类Dev

通过引用修改哈希数组

来自分类Dev

PHP数组通过引用传递?

来自分类Dev

通过引用修改数组

来自分类Dev

PHP数组通过引用传递?

来自分类Dev

NameError在理解中引用类变量