函数传递数组需要注意的地方

     首先从一个错误的程序开始,这个程序想要从一个给定的数组建立一个链表把数组的元素放进去,代码如下:

/*定义了结点的结构体*/
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

/*打印链表*/
void display(ListNode *List)
{
    ListNode *it = List;
    while (it != NULL)
    {
        cout << it->val << " -> ";
        it = it->next;
    }
    cout << endl;
}

/*新建链表*/
ListNode *CreateList(int A[])  //当数组名作为形参进行传递时,沦落为一个普通指针
{
    int n = sizeof(A)/sizeof(int); //这里期望获得数组元素的个数,然而却是1
    ListNode *List1 = (ListNode *)malloc(sizeof(ListNode));
    List1->val = A[0];
    List1->next= NULL;
    ListNode *it = List1;
    for(int i = 1; i < n; i++)
    {
        ListNode *tmp = (ListNode *)malloc(sizeof(ListNode));
        tmp->val = A[i];
        tmp->next = NULL;
        it->next = tmp;
        it = tmp;
    }
    return List1;
}


int main(void)
{
    int A[] = {1,2,3,4};
    ListNode* List1 = CreateList(A);  //注意这里将数组名作为参数进行传递
    display(List1);
    return 0;
}



     程序的错误在于将数组名作为参数进行传递的时候,在createList函数中使用了sizeof(数组名),我们期望得到的是这个数组的size,然而只返回了一个指针的size,所以我们要将数组的长度作为参数和数组名一起传过去。
     还有一种解法,就是传递数组的引用,改为 ListNode *CreateList( int (&A)[4]) , 数组的引用作为参数可以保留数组长度信息,如下代码:
#include <iostream>

using namespace std;

void foo1(int a[])  //形参是数组名,沦为指针
{
    cout <<"形参数组名:  the element number of int a[] is: "<<sizeof(a)/sizeof(int)<<endl;
}

void foo2(int (&a)[5])  //这里形参是数组的引用而非数组名
{
    cout <<"形参数组引用:the element number of int a[] is: "<<sizeof(a)/sizeof(int)<<endl;
}

int main()
{
    int a[5] = {0,1,2,3,4};
    foo1(a);
    int (&p)[5] = a;  //p是a的引用
    foo2(a);
    foo2(p);   //这两种传递方式都可以
    return 0;
}


运行结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值