在c++中将数组压入函数

pushing an array to a function in c++?

本文关键字:函数 数组 c++      更新时间:2023-10-16
        {
            int a[3];
            mainClassStack.pushNumber(a[1,2,3]);
            break;
        }
void stack_class::pushNumber(int numberFunc)
{
    if(head==NULL)
    {
        head = new stack_struct;
        head->number = numberFunc;
        head->next_number = NULL;
        tailPointer=head;
    }
    else
    {
        pointerFunc = new stack_struct;
        pointerFunc->number=numberFunc;
        pointerFunc->next_number=NULL;
        head->next_number=pointerFunc;
        head=pointerFunc;
    }
}

void stack_class::pushNumber(char charFunc)
{
    int a=0;
    a=charFunc;
    if(head==NULL)
    {
        head = new stack_struct;
        head->number = a;
        head->next_number = NULL;
        tailPointer=head;
    }
    else
    {
        pointerFunc = new stack_struct;
        pointerFunc->number=a;
        pointerFunc->next_number=NULL;
        head->next_number=pointerFunc;
        head=pointerFunc;
    }
}

void stack_class::pushNumber(int arrayFunc[3])
{
    if(head==NULL)
    {
        for(int i=0;i<3;i++)
        {
            head = new stack_struct;
            head->number = arrayFunc[i];
            head->next_number = NULL;
            tailPointer=head;
        }
    }
    else
    {
        for(int i=0;i<3;i++)
        {
            pointerFunc = new stack_struct;
            pointerFunc->number=arrayFunc[i];
            pointerFunc->next_number=NULL;
            head->next_number=pointerFunc;
            head=pointerFunc;
        }
    }
}

我正在重载函数并将数组压入适当的函数中,该函数稍后将数组中的值添加到动态链表中。到目前为止,我已经写了这个,但是当我试图打印链表时,它显示了垃圾。我哪里做错了?

这对你来说更有意义吗?

void Foo(int arg[])
{
  printf("%in", arg[0]);
  printf("%in", arg[1]);
  printf("%in", arg[2]);
}
int main()
{
  int a[3] = {1,2,3};
  Foo(a);
  return 0;
}

输出是:

1
2
3

为了更清楚地说明其他人指出的内容,逗号操作符返回序列中的最后一个值。表达式(1, 2, 3)的值因此是3,因此表达式a[1, 2, 3]只不过是表示a[3]的一种很长的方式。

但是还有一些东西看起来很傻,就是这里的这个循环:

if(head==NULL)
{
    for(int i=0;i<3;i++)
    {
        head = new stack_struct;
        head->number = arrayFunc[i];
        head->next_number = NULL;
        tailPointer=head;
    }
}

你把head指向一个新东西,在里面设置一些东西,然后设置tailPointer指向同一个新东西…然后马上重复同样的两次。你看到问题了吗?在循环结束时,您创建了三个项,它们的next_number值都是NULL,并且headtailPointer都指向同一个对象:最后创建的对象。您没有任何东西指向您创建的前两个项,而且它们都不指向彼此。换句话说,在这个操作结束时根本没有链表(尽管有一些新对象躺在内存的某个地方,无法访问或取消分配)。

你可能想把if语句放在循环中,而不是反过来,但你需要改变的不仅仅是这些,因为另一个for循环中的代码也可能有一点问题。它创建了一个新项目,然后建立了一个从头部项目到新项目的链接,但随后它将头部移动到指向新项目的位置,因此您成功地将一个项目添加到列表的尾部,但留给自己一个实际上指向尾部的head变量。

我建议查看正在发生的事情的最佳方法是拿起铅笔和纸,写下您的变量并绘制框来表示您的对象,其中包含其成员变量,然后一步一步地遵循您的代码,写入变量值或从指针中擦除并绘制箭头以显示每个人的位置。我想你马上就会发现你的算法哪里出错了。

c++不允许将整个数组作为参数传递给函数。但是,您可以通过指定数组的名称而不指定索引来传递指向数组的指针。

如果你想传递一个一维数组作为函数的实参,你必须用以下三种方式之一声明函数的形式形参,这三种声明方法都会产生类似的结果,因为每种方法都告诉编译器将要接收一个整型指针。

Way-1

作为指针的形式形参如下:

void myFunction(int *param){...}

方法2

作为大小数组的形式参数如下:

void myFunction(int param[10]){...}

3

作为未大小数组的形式参数如下:

void myFunction(int param[]){...}