sizeof专题(五)数组的sizeof

sizeof专题(五)数组的sizeof
  • 数组的sizeof值等于数组所占用的内存字节数,如:

char a1[] = "abc";
int a2[3];
sizeof( a1 ); // 结果为4,字符 末尾还存在一个NULL终止符
sizeof( a2 ); // 结果为3*4=12(依赖于int)

  • sizeof还可以用来求数组元素的个数。

int c1 = sizeof( a1 ) / sizeof( char );   // 总长度/单个元素的长度
int c2 = sizeof( a1 ) / sizeof( a1[0]);   // 总长度/第一个元素的长度

  • 写到这里,似乎领悟了sizeof与数组的关系,如果下面的题目出现在你的面试中,你能答对吗?( 我的理解: 其实这道题目与sizeof本身无关,它的迷惑性在于数组和指针之间的暧昧关系
*********************************************************
void foo3(char a3[3])
{
  int c3 = sizeof( a3 ); // c3 == ???
}
void foo4(char a4[])
{
  int c4 = sizeof( a4 ); // c4 == ???
}
*********************************************************
  • 也许当你试图回答c4的值时已经意识到c3答错了,是的,c3!=3。

这里函数参数a3已不再是数组类型,而是蜕变成指针。相当于char* a3,为什么仔细想想就不难明白。

我们调用函数foo1时,程序会在栈上分配一个大小为3的数组吗?不会!

数组是“传址”的,调用者只需将实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。

我的理解:数组或者说数组名,其实是一个地址常量。sizeof(数组名)时,就相当于 sizeof(地址常量),其实该地址存放的内容只是该数组的第一个元素,但是由于数组是一个完整的数据结构,是一系列连续内存地址的有机整体,因此, sizeof(数组名)返回的是整个数组所占的内存单元。而其他对数组名的任何操作,数组名都将做为地址(而不是指针)传递或运算。

特别强调:数组名并不是指针,是为指针是变量,而数组名是常量,这就导致数组名不能作左值,即不能被赋值。例如:int array[10]; array ++ ; //error

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值