详解strlen和sizeof在数组的中的使用(一)

举报
执久呀 发表于 2022/02/18 12:26:44 2022/02/18
【摘要】 ​  目录一、前言二、sizeof和strlen他们各自是是什么?有什么区别?sizeof类型的题目题目解析 :32位平台下:​ 64位平台下:一、前言     前面我们学习了字符串函数的使用,不过呢字符串函数也基本结束了,现在呢我们来讲点不一样的东西,有关于sizeof和strlen的使用二、sizeof和strlen他们各自是是什么?有什么区别?1.sizeof是一个操作符,不需要引头文...

  目录

一、前言

二、sizeof和strlen他们各自是是什么?有什么区别?

sizeof类型的题目

题目解析 :

32位平台下:​

 64位平台下:




一、前言


     前面我们学习了字符串函数的使用,不过呢字符串函数也基本结束了,现在呢我们来讲点

不一样的东西,有关于sizeof和strlen的使用





二、sizeof和strlen他们各自是是什么?有什么区别?


1.sizeof是一个操作符不需要引头文件,形式一般是sizeof(变量或表达式),计算的是

   所占的空间大小。单位是字节,所以他可以计算任意类型的大小

2.strlen我们相当熟悉,strlen是字符串函数,要引出头文件<string.h>,且他只能计算

   字符的大小,单位是字节,不能用来计算其他类型的大小,遇到'\0'才会停止

3.事实上他们并没有什么关联,一个是操作符,一个是函数。上面标红的部分就是他们的

   主要区别了。




先插播一点知识数组名是首元素地址,只有&数组名和sizeof(数组名)  才表示整个数组,其他的

统统都是首元素地址,只有这两种形式,其中sizeof(数组名)不能加任何东西,也不能少,比如

sizeof(数组名+0),那么此时数组名表示的就是首元素地址指针就是地址在32位/64位平台下是

4/8字节。


仔细理解上面的话,理解之后那么下面上题目:

sizeof类型的题目

#include<stdio.h>
int main()
{
	int arr[] = { 1, 3, 5, 7, 9};
	printf("%d\n", sizeof(arr));

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

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

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

	printf("%d\n", sizeof(&arr[0]));

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

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

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

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

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

	return 0;
}

题目解析 :

第一个sizeof(arr),计算的是整的数组的大小所以结果是5*4=20字节 。                                 

 第二个sizeof(arr+1)其中arr是首元素地址,arr+1表示的是第二个元素的地址,既然是地址,那就是4或8字节,不理解的话可以看看上面的插播的知识。

第三个sizeof(*arr),*arr表示拿到首元素,而首元素类型是int,所以大小是4字节。

第四个sizeof(&arr),&arr表示拿到整个数组的地址,既然是地址所以是4或8字节。

第五个sizeof(&arr[0]),&arr[0]表示拿到了第一个元素的地址,所以是4或8字节。

第六个sizeof(&*arr),因为&和*是同一优先级的,但是结合性是从从右到左,所以先*arr表示拿到首元素,再&(*arr),表示拿到了第一个元素的地址,所以是4或8字节。

第七个是sizeof(*&arr),先&arr表示拿到整块数组的地址,*(&arr),表示拿到整个数组的所有的元素,因为数组的类型是int,所以是5*4=20字节。

第八个是sizeof(&arr+1),&arr拿到整个数组的地址,&arr+1跳过整个数组,得到下块的地址因为sizeof只是算出,不是具体执行,所以不存在越界访问,既然是地址,是4或8字节。

第九个是sizeof(*arr+1),arr是首元素,*arr拿到首元素,(*arr+1)所以是首元素自增一,(即加1)因为是int类型,所以是4字节。

第十个是sizeof(arr+0),单独的sizeof(arr)表示整个数组,但是arr+0表示首元素地址,所以是4或8字节。


在vs编译器下运行结果如下:

32位平台下:


 64位平台下:

 所以结果就是这样。ok,咱们下期见



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。