C语言使用sizeof,strlen计算数组、指针大小长度汇总

目录

一、字符串数组 

二、字符数组 

三、int型数组 

四、字符指针

五、二维数组


注意:数组名除了在sizeof()和&()表示数组地址,其他都表示首元素地址。

地址所占字节4(32位)/8(64位)。

一、字符串数组 

char arr[ ]={"abcdef"};
sizeof解析strlen
arr7包括\06
arr+04/8首元素地址+0仍表示首地址6
*arr1*对首地址解引用表示首元素error(对arr数组名解引用操作会得到字符‘a’->ASCII码97(地址)后面不会再遇到'\0',而strlen遇到'\0'才会停止,所以这种写法就是错误的。)
arr[1]1第一个元素error(同上)
&arr4/8数组地址6
&arr+14/8+1跳过整个数组后的地址随机
$arr[0]+14/8第二个元素的地址5

解析:

sizeof(arr)--——--表示计算数组整体的大小。(字符串末尾还有一个‘\0’所以答案为6+1=7)

sizeof(arr+0)--——--表示计算首元素地址大小。(只要是地址,不是4就是8,取决32位/64位)

sizeof(*arr)--——--表示计算首元素字节大小。(字符‘a’,char类型,所以字节大小是1)

sizeof(arr[1])--——--表示计算第二个元素字节大小(字符‘b’,所以字节大小是1)

sizeof(&arr)--——--表示计算arr数组地址的大小(&数组名 表示取出整个数组的地址)(地址)

sizeof(&arr+1)--——--表示计算跳过整个数组后的地址大小(但也是地址)

sizeof(&arr[0]+1)--——--表示计算第二个元素的地址大小(但也是地址)

strlen(arr)--——--计算数组整体长度,arr代表了数组首元素地址(计算结果是6)

strlen(arr+0)--——--和strlen(arr)一样(计算结果是6)

strlen(&arr[0]+1)--——--表示跳过第一个元素开始计算长度(计算结果是5)

strlen (*arr) --——--对arr数组名解引用操作会得到字符‘a’->ASCII码97(地址)后面不会再遇到'\0',而strlen遇到'\0'才会停止,所以这种写法就是错误的。

strlen (arr[1]) --——--同理可得,strlen(arr[1])也是错误的。

strlen (&arr) --——--&arr表示整个数组的地址," const char *" 类型 的 实参 与 " char *" 类型 的 形参不兼容, 函数 形参 为 char *的 类型 直接写入字符串报错。

二、字符数组 

char arr[ ]={'a','b','c','d','e','f'};
sizeof解析strlen
arr6数组大小随机值
arr+04/8首元素地址+0仍表示首地址随机值
*arr1*对首地址解引用表示首元素error
arr[1]1第一个元素error
&arr4/8数组地址随机
&arr+14/8+1跳过整个数组后的地址随机
$arr[0]+14/8第二个元素的地址随机

三、int型数组 

int a[ ]={1,2,3,4}
sizeof解析
a16数组总大小
a+04/8a表示首元素地址+0仍然是
*a4a是首元素地址*解引用表示首元素
a+14/8a是首地址+1表示第二个元素的地址
a[1]4第二个元素
&a4/8数组地址
*&a16数组地址解引用表示整个数组
&a+14/8数组地址+1跳过整个数组仍是地址
&a[0]4/8第一个元素地址
&a[0]+14/8第二个元素地址

四、字符指针

char*p="abcdef"
sizeof解析strlen
p4/8计算指针变量P的大小6
p+14/8字符b的地址5
*p1就是一个字符‘a'error
p[0]1==*(p+0)=='a'error
&p4/8地址随机
&p+14/8地址随机
&p[0]+14/8第二个元素地址5

五、二维数组

int a[3][4]={0};
sizeof解析
a483*4*4整个数组
a[0]16第一行
a[0][0]4第一个元素
a[0]+14/8第一行第二个元素地址
*(a[0]+1)4第一行第二个元素
a+14第二行地址,二维数组首元素地址是第一行(把二维看成一维)
*(a+1)16a[1]
&a[0]+14第二行地址
*(&a[0]+1)16
*a16第一行
a[3]16

 

 

 

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值