总结sizeof()和strlen()和数组、字符数组、字符串之间的作用

sizeof()

牢记sizeof()是表达式不是函数,sizeof()可以用来求变量 、数组、对象、结构体等所占空间的大小,其实只要将sizeof()操作的参数理解成类型,围绕类型就不怕一些坑。

sizeof()和数组

只有两种情况下数组名可以表示整个数组:(1)sizeof(数组名):此处数组名不能修饰,否则表示数组首元素的地址(2)&数组名
其他时候像数组名单独使用,或者是sizeof内部谁数组名相关表达式都表示的是数组首元素的地址。
整型数组:

int a[] = { 1, 2, 3, 4 };
    printf("%d\n", sizeof(a));//16:a数组名单独使用表示整个数组,由于每个元素是int类型,所以结果为4*4=16
    printf("%d\n", sizeof(a+0));//4:数组首元素的地址的大小
    printf("%d\n", sizeof(*a));//4:数组第0个元素的大小(int类型的)
    printf("%d\n", sizeof(a+1));//4:数组第1个元素的大小
    printf("%d\n", sizeof(a[1]));//4:数组第一个元素的大小
    printf("%d\n", sizeof(&a));//4(数组首元素的地址)
    printf("%d\n", sizeof(&a+1));//4(第1个元素的地址)
    printf("%d\n", sizeof(&a[0]));//4(第0个元素的地址)
    printf("%d\n", sizeof(&a[0]+1));//4(第一个元素的地址)
sizeof和字符数组:
char a[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    printf("%d\n", sizeof(a));//6:求的是整个数组的大小,由于每个元素大小是1,所以结果是6
    printf("%d\n", sizeof(a + 0));//4:求的是数组首元素的地址
    printf("%d\n", sizeof(*a));//1:求的是第0个元素的大小
    printf("%d\n", sizeof(a + 1));//4:求的是第1个元素的地址
    printf("%d\n", sizeof(a[1]));//1:求的是第一个元素的大小
    printf("%d\n", sizeof(&a));//4(数组首元素的地址)
    printf("%d\n", sizeof(&a + 1));//4(第1个元素的地址)
    printf("%d\n", sizeof(&a[0]));//4(第0个元素的地址)
    printf("%d\n", sizeof(&a[0] + 1));//4(第一个元素的地址)
sizeof和字符串
char* p = "abcdef";
    printf("%d\n", sizeof(p));//4   8:对指针变量求sizeof,32位机器在下是4,64位机器下是8如果是char p[]="abcdef";那么结果就是7,要包含'\0'
    printf("%d\n", sizeof(p+1));//4   8:指针变量+1跳过一个指向的对象,指指向b结果不变,仍然是指针
    printf("%d\n", sizeof(*p));//1 :相当于sizeof('a')自然是1
    printf("%d\n", sizeof(p[0]));//1:同上
    printf("%d\n", sizeof(&p));//4 8 :&p相当于第0个元素的地址(机器不同大小也不同)
    printf("%d\n", sizeof(&p+1));//4 8:第1个元素的地址
    printf("%d\n", sizeof(&p[0]+1));//4 8:第一个元素的地址
sizeof和二维数组
    int a[3][4] = { 0 };
    printf("%d\n", sizeof(a));//48:单独使用数组名,要理解成整个数组,数组存储是{{0,0,0,0},{0,0,0,0},{0,0,0,0}}所以12*4=48
    printf("%d\n", sizeof(a[0][0]));//4:数组中第一个元素的大小,所以是4
    printf("%d\n", sizeof(a[0]));//16:数组第0行的大小,内部包含四个元素
    printf("%d\n", sizeof(a[0]+1));//4:a[0]+1=a[0][1]是一个元素
    printf("%d\n", sizeof(a+1));//4:第1行的地址
    printf("%d\n", sizeof(&a[0]+1));//4:第一行的地址
    printf("%d\n", sizeof(*a));//16:如果是一维数组表示第一个元素,二维数组表示第0行元素
    printf("%d\n", sizeof(a[3]));//16:

strlen:

返回C风格字符串的长度,特殊的也可以求字符数组的长度

字符数组和strlen

我们应该知道字符串有两种定义方式:

1char* str="abcdfe";
2char str[]="abcdfe";

在这里要区别字符数组和字符串和字符串第二种定义方式的区别,字符串如果写成字符数组应该是,char str[]={'a','b','c','d','f','e','\0'};这才是完整的
下面是一个例子,可以帮助加深理解两者的区别:

char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    printf("%d\n", strlen(arr));//随机数(strlen再求字符串的长度的时候是以'\0'作为结束标志的,此处没有'\0'自然就是随机数了
    printf("%d\n", strlen(arr+0));//随机数和上面结果相同但是意义不同,上面纯粹是求字符数组的长度,下面是从第一个元素a开始求之后的长度
    printf("%d\n", strlen(*arr));//出错(此处他把*arr='a'(97当做起始地址去找,但是这块地址是不能访问的)
    printf("%d\n", strlen(arr[1]));//出错:类型问题(地址是常量)
    printf("%d\n", strlen(&arr));//出错:类型问题
    printf("%d\n", strlen(&arr+1));//出错;类型问题
    printf("%d\n", strlen(&arr[0]+1));//随机数-1(是从b开始向后求长度)
strlen和字符串
char* p = "abcdef";
    printf("%d\n", strlen(p));//6:p指向字符串开始的位置,strlen就从指向的位置往下计数,遇到'\0'才停止   
    printf("%d\n", strlen(p+1));//5:p+1,实际上加得是指向对象的大小,所以指向b,从b向后数遇到'\0'停止。
    printf("%d\n", strlen(*p));//出错
    printf("%d\n", strlen(p[0]));//出错
    printf("%d\n", strlen(&p));//出错
    printf("%d\n", strlen(&p+1));//出错
    printf("%d\n", strlen(&p[0]+1));//5:p[0]就是首元素a,在&操作后就是a的地址,+1,就指向了b,从b向后计算长度
  • 29
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值