IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言——sizeof与strlen用法 -> 正文阅读

[C++知识库]C语言——sizeof与strlen用法

一、sizeof简介及用法

1.sizeof 的简介

(1)sizeof是运算符,它的类型可以是类型,类型又包括整形、字符型、浮点型,结构体类型等,计算的是分配空间的实际字节数。
(2)sizeof在编译时就计算出类型实际所占的字节数大小
(3)sizeof不能计算动态分配空间的大小

2.sizeof 的用法

(a).以整形、字符型、浮点型、结构体类型作为参数

struct Stu
{
	char name[20];
	int num;
};
int main()
{
	int a = 10; //定义整形数据类型a
	printf("  %zu\n", sizeof(a)); // 4 --> 计算整形a所占字节数大小

	char ch = "A";
	printf("  %zu\n", sizeof(ch)); // 1 --> 计算字符型ch所占字节数大小

	double b = 10.0;
	printf("  %zu\n", sizeof(b)); // 8 --> 计算浮点型b所占字节数大小

	struct Stu stu;
	printf("  %zu\n", sizeof(stu)); // 24 --> 计算结构体类型stu所占字节数大小(内存补齐)
	return 0;
}

在这里插入图片描述

(b).以一维数组、二维数组、字符数组作为参数

当数组作为参数的时候,这里我们先来了解数组名的意义

(1)sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
(2)&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
(3)除此之外所有的数组名都表示首元素的地址
int main()
{
		//一维数组
	int arr[5] = { 1,2,3,4,5 };
	//20,arr作为数组名单独放在sizeof内部,计算的是数组总大小,单位是字节
	printf("  %zu\n", sizeof(arr));
	//4,arr并非单独放在sizeof内部,也没有&,所以这里计算的就是首元素地址,单位是字节
	printf("  %zu\n", sizeof(arr + 0));

		//二维数组
	int arr1[3][4] = { 0 };
	//48,arr1单独放在sizeof内部,计算的是数组总大小,3*4*4=48,单位是字节
	printf("  %zu\n", sizeof(arr1));
	//4,arr1并非单独放在sizeof内部,也没有&,所以计算的是第二个元素的大小
	//此时二维数组要想象为一维数组 (arr1 + 1) < -- > arr1[1][j](j=0,1,2,3)的 "地址"
	//还要注意的是既然是 "地址" 就一律按4个字节处理(32位机器的条件下)
	printf("  %zu\n", sizeof(arr1 + 1));

		//字符数组
	char str[] = { 'a','b','c','d','e','f' };
	//6,str单独放在sizeof内部,计算的是数组总大小,单位是字节
	printf("  %zu\n", sizeof(str));
	//4,str没有单独放在sizeof内部,也没有&,str表示的是首元素 "地址",
	//(str + 1)计算第二个元素的 "地址" ,是 "地址" 就是4个字节(32位机器下)
	printf("  %zu\n", sizeof(str + 1));
	return 0;
}

在这里插入图片描述

?.sizeof在编译时就计算出类型实际所占的字节数大小

int main()
{
	int num = 10;
	printf("%zu\n", sizeof(num = 10 + 20));
	//sizeof()在编译时就计算出结果,所以num=10,并不会计算sizeof里面的表达式
	printf("%d\n", num);
	return 0;
}

(d)sizeof不能计算动态分配空间的大小

int main()
{
	int* p = (int*)malloc(sizeof(int) * 20);
	for (int i = 0; i < 20; i++)
	{
		*(p + i) = i;
	}
	//4,p作为数组名单独放在sizeof内部,计算的是整个数组,
	//而sizeof并不会计算动态分配的内存,所以结果为4(32位条件下)
	printf("%zu\n", sizeof(p));
	free(p);
	return 0;
}

在这里插入图片描述

二、strlen的简介及用法

(1)strlen()是库函数,它计算的是字符串(char*)的字符个数,要引头文件 #include<string.h>.
(2)strlen()计算的是 '\0'前面的字符个数,而不包括'\0'.
(3)strlen与sizeof的区别,在计算字符串个数时,strlen以'\0'为结束标志,而sizeof则是你有多少个字符就计算多少个字符.

1.strlen()函数与操作符sizeof的区别

int main()
{
	char str[] = { 'a','b','c','d','e','\0' };
	//5,计算字符个数,遇到'\0'就停止,不包括'\0'
	printf("%d\n", strlen(str));
	//6,你有多少个字符就计算多少个字符
	printf("%zu\n", sizeof(str));
	return 0;
}

2.模拟实现strlen()函数

//模拟实现strlen()函数
int my_strlen(const char* str)
{
	//断言,防止传入参数为空字符
	assert(str);
	char* p = str;
	while (*str++);
	return str - p - 1;
}

int main()
{
	char str[] = "abcd";
	int ret = 0;
	ret = my_strlen(str);
	printf("%d\n", ret);
	return 0;
}

3.strlen()函数计算字符数组题型解析

int main()
{
	char str[] = { 'a','b','c','d','e','f' };
	//计算字符数组的字符个数,但是这里没有'\0',所以没有结束标志
	//这里打印的是一个随机值,具体多少看内存布局
	printf("%d\n", strlen(str));
	//随机值,这里str是首元素地址(str + 0)还是首元素地址
	printf("%d\n", strlen(str + 0));
	//语法错误,对首元素解引用得到首元素地址的值'a',而不是地址
	//strlen函数要求传入参数为一个值的地址,
	printf("%d\n", strlen(*str));
	//语法错误,str[1] <--> *(str + 1)得到也是一个值,而不是地址 
	printf("%d\n", strlen(str[1]));
	return 0;
}

在这里插入图片描述

4.strlen()函数计算字符串题型解析

int main()
{
	char str[] = "abcdefghi";
	//9,str作为首元素地址,往后计算字符个数,遇'\0'停止
	printf("%d\n", strlen(str));
	//9,(str + 0)依旧为首元素地址,计算字符个数
	printf("%d\n", strlen(str + 0));
	//语法错误,对首元素解引用得到字符'a',而不是地址
	printf("%d\n", strlen(*str));
	//语法错误,str[1] <--> *(str + 1)与上例题一致
	printf("%d\n", strlen(str[1]));
	return 0;
}

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 10:54:41  更:2022-09-13 10:58:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 12:42:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码