数组的计算 sizeof strlen

本文详细解析了一维和二维数组在不同运算符作用下的字节数计算规则,包括int型、char型及指针变量型的一维数组,以及int型的二维数组,并通过实例说明了sizeof与strlen函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、一维数组的计算

(一)int

int a[]={1,2,3,4}  

printf("%d\n",sizeof(a));\\16 

原因是:数组名单独放在sizeof内部,相当于取出整个数组,因为这是一个含四个元素的数组,且都为整型,因此为16。printf("%d\n",sizeof(a+0));\\4

原因呢是:a+0表示数组的首元素的地址,而地址在sizeof内,均为4个字节

printf("%d\n",sizeof(*a));\\4

原因是:*表示解引用,在此应用,表示数组的首元素

printf("%d\n",sizeof(a+1));\\4

原因是:在这里a+1表示数组第二个元素的大小

printf("%d\n",sizeof(a[1]));\\4

原因是:在这里a[1]表示数组第二个元素

printf("%d\n",sizeof(&a));\\4

原因是:&表示取地址,在此取出数组的地址,而不论什么地址都是4个字节

printf("%d\n",sizeof(*&a));\\16

原因是:再取出数组的地址后,对其解引用,相当于取整个数组

printf("%d\n",sizeof(&a+1));\\4

原因是:在取地址之后加一,表示下一个数组,而在VC编译器上默认和上一个数组的类型类似,而地址在此情况下表示4个字节。 

(二)char

char arr[]={'a','b','c','d','e','f'}        6个

printf("%d\n",sizeof(arr))\\6

数组名单独放在sizeof内,表示整个数组的大小,而又因为是char型,因此为6个字

printf("%d\n",sizeof(arr+0))\\

a+0表示数组的首元素的地址,而地址在sizeof内,均为4个字节 

printf("%d\n",sizeof(*arr))\\1

*arr表示取出数组的首元素,所以他的大小为1个字

printf("%d\n",sizeof(arr[1]))\\1

arr[1]表示数组第二个元素,即b这个元素,因此为1个字

printf("%d\n",sizeof(&arr))\\4

&arr表示数组的地址,地址在sizeof内,均为4个字节

printf("%d\n",sizeof(&arr+1))

&arr表示数组的地址,&arr+1表示下一个数组的地址,在此情况下,编译器默认为与前一个同一类型,而地址在sizeof内,均为4个字

printf("%d\n",sizeof(&arr[0]+1))\\4

&arr[0]+1表示数组中第二个元素的地址,因此为4

printf("%d\n",strlen(arr))\\随机值

strlen是计算数组的长度,当遇到NULL时,停止统计长度,而在此情况下,没有NULL字符,因此是一个大于6的随机值

printf("%d\n",strlen(arr+0))

arr+0表示数组首元素的地址,而在此情况下,没有NULL字符,因此是一个大于6的随机值

printf("%d\n",strlen(*arr))\\无值

*arr表示数组首元素,而在此情况下,会让系统崩溃

printf("%d\n",strlen(arr[1]))\\无值

arr[1]同

printf("%d\n",strlen(&arr))

&arr表示取出数组的地址(同首元素的地址),而在此情况下,没有NULL字符,因此是一个大于6的随机值

printf("%d\n",strlen(&arr+1))\\随机值

&arr表示取出数组的地址,&arr+1,则表示指向这个数组的下一个数组,因此为随机值

printf("%d\n",strlen(&arr[0]+1))

&arr[0]表示数组的首元素的地址,而在此情况下加一,表示数组第二个元素,因此为大于5的随机值

(三)指针变量型

char*p="abcdef";

printf("%d\n",sizeof(p));\\4

指针变量p中保存的事abcdef的地址,因此在sizeof内部,表示4个字节

printf("%d\n",sizeof(p+1));\\4<

p+1表示下一个字符串的地址,而在此情况下,平台默认为同上一个数组,在sizeof内,地址均表示4个字节

printf("%d\n",sizeof(*p));\\1

p存放的是字符数组“abcdef”的地址,而*p表示的是字符数组的首元素,因此大小为1  

printf("%d\n",sizeof(p[0]));\\1

p[0]表示字符数组首元素,因此为1个字节

printf("%d\n",sizeof(&p));\\4<

&p表示取出整个字符数组的地址,而地址在sizeof内部均为4个字节

printf("%d\n",sizeof(&p+1));\\4

&p+1表示下一个字符数组的地址,地址不论在哪种情况下,均表示4个字节

printf("%d\n",sizeof(&p[0]+1));\\4

&p[0]表示字符数组首元素的地址,而给其+1表示字符数组第二个元素的地址,因此,根据上面所说,表明为个字节

printf("%d\n",strlen(p));\\6

strlen求取字符串的长度,遇‘\0’即停止计算,在字符串的后面默认有‘\0’,因此此字符串长度为6

printf("%d\n",strlen(p+1));\\5

p+1表示第二个元素,因此长度为5

printf("%d\n",strlen(*p));\\崩溃

*p表示数组首元素,此时会让系统崩溃

 printf("%d\n",strlen(p[0]));\\崩溃

同上

printf("%d\n",strlen(&p));\\随机值

&p表示取出整个字符数组的地址,此时不会遇到‘\0’,因此为随机值

printf("%d\n",strlen(&p+1));\\随机值<

&p+1表示下一个数组的地址,因此为随机值

printf("%d\n",strlen(&p[0]+1));\\5

p[0]+1表示数组中第二个元素的地址,从此之后,会遇到‘\0’,因此为5个字节

二、简述二维数组的 

int a[3][4]={0};

printf("%d\n",sizeof(a));\\48

此二维数组中有12个元素,为int型,因此有48个字节

printf("%d\n",sizeof(a[0][0]));\\4

表示数组中第一行第一列的元素,因此为4个字节

printf("%d\n",sizeof(a[0]));\\16

表示数组中第一行的元素,有4个元素,因此为16个字节

printf("%d\n",sizeof(a[0]+1));\\4

a[0]表示数组首行元素,而a[0]+1表示首行中第二个元素,因此为4个字节

printf("%d\n",sizeof(*a));\\16

表示首行元素的地址,因此为16个字节

printf("%d\n",sizeof(*a+1));\\4

表示数组首行中第二个元素的地址,因此为4个字节 

printf("%d\n",sizeof(a[3]));16

在此情况下,系统默认为上一个相同,详见下图


 

 

写的不好的地方,还请大家多多指教  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值