当前位置:网站首页>为什么被调函数内部不能用 sizeof(arr) / size(arr[0]) 计算数组长度?
为什么被调函数内部不能用 sizeof(arr) / size(arr[0]) 计算数组长度?
2022-07-24 16:42:00 【碳基肥宅】
本文是对该C语言小困惑的一个解答。
本文测试采用的编译器为64位的 RedPandaDevc++编译器。

我们给出如下测试代码:
int Test(int arr[]){
return sizeof(arr)/sizeof(arr[0]);
}
int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int ret = Test(arr);
printf("%d",ret);
}提出这个困惑的朋友们都知道,这段代码是不可能实现“计算数组长度”这个功能的。
那么它的输出结果可能是多少呢?

解答:
∵ 数组名作为函数实参传递时,传递的实际是其首元素的地址。接收的一方,接收的实际是指针。
上述代码中, int ret = Test(arr); 这当中的arr是数组的首元素地址,即&arr[0]
int Test(int arr[]),int arr[]等价于int* arr,用作接收的形参实际是指针。
∴ 在函数中,sizeof(arr),arr虽然和数组名长得一样,但其实并不是数组名,而是指针变量(相当于 int* p,sizeof(p))
∴ 指针变量的长度是4字节或8字节,sizeof(指针变量)自然就输出4或8
//测试一下指针变量的长度
int main(){
int a;
int* p = &a;
printf("%zu",sizeof(p));
return 0;
}
所以同理,在被调函数内部,由于arr也是指针,sizeof(arr)并不会输出数组的长度,而是指针变量的长度,也会输出4或者8.
有些同学可能会纠结于,数组名不就代表首元素的地址吗?是的,数组名在大部分情况下代表数组首元素地址(例外情况下面说),但和本题是两码事。
虽然首元素的地址和数组的地址是同一个,但是不影响一个是指针一个是数组名。记住被调函数中没有整个数组,只有一个指针即可。
回到 sizeof(arr) / size(arr[0]) 这一表达式。sizeof(arr)值为8(或4),arr[0]为普通的int类型变量,sizeof(arr[0])的值和sizeof(int)的值相等,都是4 (int类型的长度也是有可能为8的,而我的编译器是4)。因而整个表达式的值是 8/4 ,输出的结果自然是2了。
但在main函数中,sizeof(arr)是会计算整个数组所占的内存空间大小。因为在sizeof中,arr并不表示数组首元素的地址,而表示整个数组。这就是数组名不表示数组首元素地址的例外情况。
可以作为结论记住:sizeof(数组名)与&数组名,正是数组名不表示数组首元素地址的例外情况。
(&数组名,取的是整个数组的地址。上述代码中的&arr+1 ,地址增加了40(个存储单元),而arr+1 和 &arr[0]+1 相等,地址增加了 4 )
int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//int ret = Test(arr);
printf("%zu",sizeof(arr)); //计算出arr数组的总空间为40
}int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int ret = sizeof(arr)/sizeof(arr[0]);
printf("%d",ret); //计算出该数组的长度为10
}考点:数组作为函数参数的使用、sizeof 操作符的使用
边栏推荐
- EventLoop event loop mechanism
- Meeting OA project progress (I)
- 我们为什么要推出Getaverse?
- 百度推广“删除重提”是什么意思?
- 【南京农业大学】考研初试复试资料分享
- Princeton calculus reader 02 Chapter 1 -- composition of functions, odd and even functions, function images
- JS simulation realizes the principles of call, apply, bind and new
- 期盼已久全平台支持-开源IM项目OpenIM之uniapp更新
- File browser? QT can also be achieved!
- Sword finger offer 48. the longest substring without repeated characters
猜你喜欢

Envi5.3 open GF-1 WFV data

Meeting OA project progress (II)

EventLoop event loop mechanism

Why should we launch getaverse?

TCP protocol debugging tool tcpengine v1.3.0 tutorial

PS pull out logo

Why should we launch getaverse?
![Leetcode:162. looking for peak [two points looking for peak]](/img/77/64b7c9bf1aebc2a0ab82218ddfff62.png)
Leetcode:162. looking for peak [two points looking for peak]

Getting started with ARP

AXI协议(1):AMBA总线介绍,AXI概念与背景介绍,AXI协议特点与功能
随机推荐
Zcmu--5023: family division (C language)
ArcGIS create vector
Minor record
Parental delegation mechanism
With regard to performance testing, dry goods hit "suggestions collection"
Getting started with ARP
Custom types: Enumeration
You really should go to the factory to move bricks!
What exactly is API?
EventLoop event loop mechanism
我们为什么要推出Getaverse?
Creation and inheritance of JS class
[LeetCode]75.颜色分类——题解(执行用时击败90% ,内存消耗击败 78%)
ARP 入门
Thinkphp3.2.5 cannot jump to external links
Meizu blood exchange: Alibaba quits? Zhuhai SASAC joins the Bureau, and Huang Zhang hands over the controlling stake! Li Nan is removed from the main staff!
The 3D sensing market is accelerating. Who will be better, TOF or structured light?
regular expression
简易版QQ?Qt也可以实现!(一)
Princeton calculus reader 02 Chapter 1 -- composition of functions, odd and even functions, function images