首先从一个错误的程序开始,这个程序想要从一个给定的数组建立一个链表把数组的元素放进去,代码如下:
/*定义了结点的结构体*/
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;
}
运行结果: