我们先来介绍一种计算数组长度的方法:
成都创新互联公司专业为企业提供鲤城网站建设、鲤城做网站、鲤城网站设计、鲤城网站制作等企业网站建设、网页设计与制作、鲤城企业网站模板建站服务,10多年鲤城做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。#includeint main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int size=sizeof(arr)/sizeof(arr[0]);
return 0;
}
这里sizeof(arr)计算的是整个数组所占内存的大小,而sizeof(arr[0])计算的是arr[10]数组首元素所占内存的大小。这样我们可以很方便的得到数组的大小,在较大型的项目中,一个数组可能会参与多个循环。用size表示数组长度的好处是,当我们需要改变数组长度时,我们只需要改变arr本身,而不用改变循环的条件。上述代码运行就可以得到size=10
接下来进入正题:
我们把以上代码封装成函数
#includeint arr_size(int arr[])
{
return sizeof(arr)/sizeof(arr[0]);
}
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",arr_size(arr));
return 0;
}
再次运行,我们期待打印出的值为10,但F5运行后得到的值却不是10
这是为什么呢?查阅资料,我们发现,c语言中,函数参数中的arr[]其实就是一个指针,它指向的是首元素的地址。
#includeint arr_size(int arr[])
{
printf("%p", arr);
return sizeof(arr) / sizeof(arr[0]);
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
arr_size(arr);
return 0;
}
用%p打印arr的地址,调试后可以发现,arr确实是首元素的地址,如下图所示
所以我们得出结论,函数中数组作参数,其本质就是一种指向数组首元素的指针,此时sizeof(arr)表示求指针的大小,在x64中为8,而sizeof(arr[0])为int型变量的大小,即为4,则前面错误代码运行的结果为8/4=2,不为10。
所以我们把函数改变一下
void arr_size(int arr[],int sz)
{
for (int i = 0; i< sz; i++)
{
printf("%d", arr[i]);
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int size=sizeof(arr) / sizeof(arr[0]);
arr_size(arr,size);
return 0;
}
我们也可以直接用指针作为参数
void arr_size(int *arr,int sz)
{
for (int i = 0; i< sz; i++)
{
printf("%d ", *(arr+i));
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int size=sizeof(arr) / sizeof(arr[0]);
arr_size(arr,size);
return 0;
}
结果同样为正确的
实际上,arr[i]就是*(arr+i)。
以上是个人关于数组名作参数的理解,谢谢你看到这里^_^
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧