这几天在看一个数据结构的视频,看到有关形参和实参的问题,发现自己之前的很多理解都不太正确。

    比如,我们遍历一个数组,我首先想到是这样写的:

    

int main()
{
int a[] = {1,2,3};
showArray(a);
}
void showArray(int *p){
int len = sizeof(p);
printf("len==%d\n",len);
int i = 0;
for (i = 0; i < len; i++){
printf("%d\n",p[i]);
}
}

 

    结果输出的值是:1,2,3,4200208。前3个值都正确,但是为什么会多出一个4200208呢?问题就出在sizeof这个关键字上。sizeof是一个单目操作符,并不是一个函数,其值在编译时确定。这里的p,是一个指针变量,大小始终为4.所以最后会多出一个垃圾数字4200208。

    可见,要遍历一个数组,单传其首地址是不够的,还需要知道它的大小。正确的程序如下:

int main()
{
int a[] = {1,2,3};
int len = sizeof(a)/sizeof(int);
showArray(a,len);
}
void showArray(int *p,int len){
printf("len==%d\n",len);
int i = 0;
for (i = 0; i < len; i++){
printf("%d\n",p[i]);
}
}