有时候我们会使用sizeof(a)/sizeof(a[0]) 的方法来防止数组的下标超出有效下标。
然而,这种方法用于作为参数的数组却行不通,无法得到正确的数组个数。有的编译器还会给出一个警告来。
#include <stdio.h>
void prtf(int b[]){
int i;
for (i = 0; i < sizeof(b)/sizeof(b[0]); i++){
printf("%d",b[i]);
}
}
int main()
{
int a[] = {1,3,5,7,10};
prtf(a);
return 0;
}
即使运行起来,也很容易发现程序并没按想像中的把135710 都打印出来,而是打印出了第一个数1 。
很显然,到这里sizeof(b)/sizeof(b[0]) 变成了1了。
试着在函数prtf() 中打印sizeof(b) 跟sizeof(b[0]) 的值可以发现,两者的值是一样的。
void prtf(int b[]){
printf("%d\n",sizeof(b));
printf("%d\n",sizeof(b[0]));
}
而且都是4。
这是因为作为prtf 参数的 int b[] 实际上是一个指针。在32位平台上,一个指针的大小刚好与int的大小相等,都是四个字节。
所以,利用sizeof()便失效了。
通常在需要用到传进来的数组大小的函数里,会多加一个参数来得到数组大小。
于是,可以这样写:
#include <stdio.h>
void prtf(int b[], int length){
int i;
for (i = 0; i < length; i++){
printf("%d",b[i]);
}
}
int main()
{
int a[] = {1,3,5,7,10};
prtf(a,sizeof(a)/sizeof(a[0]));
return 0;
}
这样便可以遍历数组了。
前面说到,int b[]其实是一个指针,也就是在函数参数里面,有
int b[] <==> int *b ,两者等价。
来验证一下这件事情:
//b[] 改成了 *b
void prtf(int *b, int length){
int i;
for (i = 0; i < length; i++){
printf("%d",b[i]);
}
}
程序依然正确运行。
当然,我们可以像操作数组一样操作指针,使用b[i]来进行操作。
举个栗子:
#include <stdio.h>
int main()
{
int i = 1;
int *p = &i;
printf("%d",p[0]);
return 0;
}
程序可以正确地输出1。
本文详细探讨了在C语言中使用数组作为参数时,如何正确计算数组大小,并指出将数组作为指针参数传递时,sizeof运算符的误用可能导致的误解。通过实例演示了如何避免错误并正确遍历数组。

984

被折叠的 条评论
为什么被折叠?



