如何求c语言中数组长度(sizeof)-->编译原理很重要

#include "stdio.h"

void getlen(char a[]);
main()
{
  char a[]="12345";
  printf("%d\n",sizeof(a));//这里可以通过数组名求出数组长度 
  getlen(a);
  
  getchar();  
}

void getlen(char a[])  //当数组名退化成指针以后是求不出数组长度了
{
  printf("%d\n",sizeof(a));     
}

执行结果:



如果作为函数的参数是没法求的, 
>   但这样是可以的: 
>   
>   #define   LENGTH(s)   (sizeof(s)   /   sizeof(int)) 
>   
>   int   s[12]; 
>   int   length   =   LENGTH(s); 
================================================== 
这样的方法只能用于数组变量的数组名,对于指向数组的指针,以及作为参数的数组名都是没有效果的,上面已经有人解释了 
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
不可能有办法的。 
当你定义一个数组的时候: 
int   a[]   =   {1,   2,   3};     //   实际上被编译为   int   a[3]   =   {1,2,3} 

数组名代表的是数组的地址。注意   ——   你绝对没有办法通过数组名动态获得数组的大小。当你丢失a的长度信息的时候,你永远不可能知道他的长度。 

那么   sizeof   是怎么回事呢?他不是通过   a   的名字获得   a的大小了么?   ——   大错特错! 

关键字   sizeof   产生的是一个编译期常量(注1)   他的运作方式是这样的: 

当你写: 
sizeof   a   
实质是: 
sizeof   (   a的类型   ) 

而a的类型是什么呢?编译器察看   a的定义发现,   是   int   [3] 
就是说,这里   sizeof   a   实质是: 
sizeof   (   int[3]   ) 
完全等同于常量   12   (假定int为4字节)。 


考虑一个函数 
void   func(   int   a[]   );     
//   写成   int   a[3]   也不会有本质区别——也许你该试试写成   int   (&a)   [3]   ? 

C++规定,数组作为形参的时候,a代表数组首地址。 
他的底层意义是:   a   退化为了一个4字节的指针,没有任何变量表示数组的大小会“自动”被传递进来。 

我们看看这个时候   sizeof   a是什么: 
sizeof(   函数形参的a[]   )     =   sizeof(   int*   const   )   =   4     //   当然a[]不是合法的C++类型 


仍然不服气?好——我们反问一个问题:若你是C   /C++的设计者,   你怎么在兼容原有设计的基础上让void   func(   int   a[]   )同时传递地址和大小? 

首先,a是一个变量,而且类似数组。他必须是一个地址,否则你不知道如何索引元素。 
他怎么再带上一个变量表示他的大小呢? 

扩充   sizeof   (a)   的能力? 

sizeof   a   必须产生代码——不管是常量还是什么。   要让他在运行时决定   a的值,   a就必须带上他的大小信息。   

1   你必须修改C标准,让C支持“两种”数组。一种是定义处的数组,他分配大片连续内存,和原来的C标准相同。 

2   另一种是作为参数传递数组。   你必须传递地址和数组大小;这个数组实际上是一个8字节的结构{   地址;   大小}(事实上可能更加复杂,考虑多纬数组如何实现?   )   

3   系统必须根据两种不同数组分别实现其   []、*   、&等。   原有的数组根据其首地址偏移(这是个常量)和下标寻址;   而参数数组则首先取“地址”内容(这是个变量),然后根据这个地址寻址.... 

厄...   再考虑多维数组——听起来这不是一整套vector模型么? 

----------------------------------------------- 
注1:   对于C99支持的   flexible   array   ,其   sizeof   运算是运行时求值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值