这几天在看一个数据结构的视频,看到有关形参和实参的问题,发现自己之前的很多理解都不太正确。
比如,我们遍历一个数组,我首先想到是这样写的:
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]); } }