有时候我们会使用sizeof(a)/sizeof(a[0])
的方法来防止数组的下标超出有效下标。
然而,这种方法用于作为参数的数组却行不通,无法得到正确的数组个数。有的编译器还会给出一个警告来。
#include
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
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
int main()
{
int i = 1;
int *p = &i;
printf("%d",p[0]);
return 0;
}
程序可以正确地输出1。