关于sizeof与strlen在数组中的应用

在了解sizeof与strlen在数组中的应用之前我们需要明确两个要点:

1.除了sizeof(数组名)表示的是整个数组,&数组名表示整个数组的地址之外其余数组名均表示数组内首元素的地址

2.strlen是从首元素开始直到\0才会停止,strlen接收的是地址

下面我们通过例题来加深理解:

1.对于整型一维数组

#include<stdio.h>

int main()
{
int a[4] = { 0 };
printf("%d\n", sizeof(*a));//对首元素的地址进行解引用,表示首元素,类型为int 结果为4
printf("%d\n", sizeof(a[1]));//a[1]=*(a+1) 数组中第二个元素的地址,解引用为第二个元素,类型为int,结果为4
printf("%d\n", sizeof(&a));//表示整个数组的地址,为地址,大小为4
printf("%d\n", sizeof(*&a));//对整个数组的地址进行解引用,表示为整个数组,类型为int ,大小为4*4=16 
printf("%d\n", sizeof(&a+1));//表示跳过整个数组的地址,仍为地址,大小为4
system("pause");
return 0;

}

2.对于字符型一维数组

#include<stdio.h>
#include<string.h>
int main()
{
char a[] = { 'a', 'b', 'c', 'd','e','f' };
printf("%d\n", sizeof(a));//表示整个数组,类型为char, 结果为6*1=6
printf("%d\n", sizeof(a+0));//表示首元素的地址,是地址,大小为4
printf("%d\n", sizeof(&a[0]+1));//表示第二个元素的地址,为地址,大小为4
printf("%d\n", strlen(a));//获取的是首元素的地址并开始查找,因为数组中没有\0,故为随机值
printf("%d\n", strlen(a+1));//从第二个元素的地址开始查找,因为数组中没有\0,故为随机值
printf("%d\n", strlen(*a));//对首元素的地址进行解引用,表示获取的是第一个元素,而strlen只能获取地址,报错
system("pause");

return 0;

3.对于字符型指针数组

#include<stdio.h>
int main()
{
char *p = "abcdef";
printf("%d\n", sizeof(p));//指针变量内存放的是首元素的地址,是地址, 大小为4
printf("%d\n", sizeof(*p));//对首元素地址进行解引用,表示首元素,这里为a,大小为1
printf("%d\n", sizeof(p[0]));//p[0]=*(p+0) 对首元素地址进行解引用,表示首元素,这里为a,大小为1
printf("%d\n", sizeof(&p));//获取的是首元素的地址,为地址,大小为4
printf("%d\n", sizeof(&p + 1));//取出指针变量p的地址,&p+1,表示跳过所指类型为char的大小,但仍未地址,大小为4
system("pause");

return 0;

4.二位整型数组

#include<stdio.h>
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//表示整个二维数组,类型为int,大小为4*3*4=48
printf("%d\n", sizeof(a[0][0]));//表示首元素地址,为地址,大小为4
printf("%d\n", sizeof(a[0]));//a[0]单独存在, 表示对首行元素,类型为int,大小为4*4=16;
printf("%d\n", sizeof(a[0] + 1));//获取的是首行元素的首地址,+为首行元素第二个元素的地址,为地址,大小为4
printf("%d\n", sizeof(a + 1));//为第一行元素的地址,&a+1,表下一行元素的地址,但仍未地址,大小为4
printf("%d\n", sizeof(a[3]));//为第三行元素,尽管值属性不存在,但类型属性存在,为int类型,大小为4*4=16
system("pause");
return 0;

}

这是我所整理的在数组中的应用,如果还有别的补充,希望大家留言评论,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值