淄博网站制作公司定制,计算机网络营销策划方案,深圳建网站信科,规划馆网站建设C语言之sizeof 和 strlen 文章目录 C语言之sizeof 和 strlen1. sizeof 和 strlen 的比较1.1 sizeof1.2 strlen1.3 sizeof 和 strlen 的对比 2. 练习2.1.1 一维数组2.1.2 字符数组 1. sizeof 和 strlen 的比较
1.1 sizeof
sizeof是C语言中的一个关键字#xff0c;计算的是变量…C语言之sizeof 和 strlen 文章目录 C语言之sizeof 和 strlen1. sizeof 和 strlen 的比较1.1 sizeof1.2 strlen1.3 sizeof 和 strlen 的对比 2. 练习2.1.1 一维数组2.1.2 字符数组 1. sizeof 和 strlen 的比较
1.1 sizeof
sizeof是C语言中的一个关键字计算的是变量所占内存空间的大小单位是字节如果操作数是数据类型的话计算的是使用该类型创建的变量所站内存空间的大小 sizeof只关心所占内存空间的大小不关心内存中存放的什么数据 例如 #include stdio.h
int main()
{int a 20;printf(%zd\n, sizeof(a));printf(%zd\n, sizeof a);printf(%zd\n, sizeof (int));//printf(%zd\n, sizeof int);//errreturn 0;
}
代码运行结果如下
sizeof计算时可以去点括号但当sizeof计算数据类型创建的变量需要占多少内存空间的时候括号不能省略第四句printf代码是错误的sizeof是单目操作符返回一个size_t类型的结果size_t是不是就是无符号整型打印size_t的结果最好用%zd否则会有警告
1.2 strlen
strlen是C语言中的一个库函数只用来求字符串的长度。函数原型如下
size_t strlen ( const char * str );strlen计算的是字符串中 ’ \0 之前的长度当没有 ’ \0 的时候strlen还是会继续往后寻找直到找到 ’ \0 ’ 所以使用不恰当就会导致越界查找 例如:
#include stdio.h
#include string.h
int main()
{char arr1[] { a,b,c };char arr2[] { abc };printf(%zd\n,strlen(arr1));printf(%zd\n, strlen(arr2));return 0;
}代码运行结果如下
arr1数组中是以单个字符的形式来存入数组中的所以数组中只有三个元素没有 ’ \0 当使用strlen求长度的时候就会越界查找导致打印一个随机值arr2数组中是以字符串形式存入数组中的字符串是默认以 ’ \0 ’ 结束所以使用strlen求字符串长度时计算的是’ \0 ’ 之前的字符数量也就是’a‘ ‘b’ ‘c’ 3个strlen的返回值也是size_t也需要使用%zd来打印
1.3 sizeof 和 strlen 的对比
sizeof sizeof是一个单目操作符sizeof计算的是操作数所占内存的大小单位是字节sizeof不关心内存中放的是什么类型 strlen strlen是一个库函数需要包含头文件string.hstrlen只用于求字符串的长度计算的是 ’ \0 之前字符的个数strlen关心内存中是否有 ’ \0 ‘会一直向后查找直到找到’ \0 可能会造成查找越界 2. 练习
2.1.1 一维数组
#include stdio.h
//数组名的理解
//数组名一般表示数组首元素的地址
//但是有2个例外
//1. sizeof(数组名)数组名表示整个数组计算的是整个数组的大小单位是字节
//2. 数组名数组名表示整个数组取出的数组的地址
//除此之外所有遇到的数组名都是数组首元素的地址
int main()
{int a[] { 1,2,3,4 };printf(%zd\n, sizeof(a)); //- sizeof(数组名)的情况计算的是整个数组的大小单位是字节 - 16printf(%zd\n, sizeof(a 0)); //a表示首元素的地址加上0之后还是首元素地址32位下为4字节64位下为8字节 - 4/8printf(%zd\n, sizeof(*a)); //a表示首元素的地址解引用之后得到第一个元素所以为4个字节 - 4printf(%zd\n, sizeof(a 1)); //a表示首元素的地址首地址加上一指向第二个元素但是还是地址是地址大小就为 - 4/8printf(%zd\n, sizeof(a[1])); //a[1]表示数组中下标为1的元素也就第二个int大小为4个字节 - 4printf(%zd\n, sizeof(a)); //- 数组名的情况取出的是整个数组的地址是地址大小就为 - 4/8printf(%zd\n, sizeof(*a)); // 1. 取地址操作符和解引用操作符相抵消得到- sizeof(数组名)的情况计算的是整个数组的大小单位是字节 - 16// 2. a 的类型是数组指针int(*)[4]*a就是对数组指针解引用访问一个数组的大小是16个字节 - 16printf(%zd\n, sizeof(a 1)); //- 数组名的情况取出的是整个数组的地址加一之后跳过了整个数组但是还是地址是地址大小就是 - 4/8printf(%zd\n, sizeof(a[0])); //取出数组中下标为0的元素的地址是地址大小就是 - 4/8printf(%zd\n, sizeof(a[0] 1));//取出数组中下标为0的元素的地址加一之后得到第二个元素的地址是地址就是 - 4/8return 0;
}代码运行结果如下 环境为VS2022,X64,Debug
2.1.2 字符数组
sizeof
#include stdio.h
int main()
{char arr[] { a,b,c,d,e,f };printf(%zd\n, sizeof(arr)); //- sizeof(数组名)的情况计算的是整个数组的大小单位是字节 -6printf(%zd\n, sizeof(arr 0)); //arr表示首元素地址加上0之后还是首元素地址32位下为4字节64位下为8字节 - 4/8printf(%zd\n, sizeof(*arr)); //arr表示首元素地址解引用之后得到第一个元素所以为4个字节 - 1printf(%zd\n, sizeof(arr[1])); //arr[1]表示数组中下标为1的元素char类型大小为1个字节 -1printf(%zd\n, sizeof(arr)); //- 数组名的情况取出的是整个数组的地址是地址大小就为 - 4/8printf(%zd\n, sizeof(arr 1)); //- 数组名的情况取出的是整个数组的地址加一之后跳过了整个数组但是还是地址是地址大小就是 -4/8printf(%zd\n, sizeof(arr[0] 1));//取出数组中下标为0的元素的地址加一之后得到第二个元素的地址是地址就是 - 4/8return 0;
}strlen
#include stdio.h
#include string.h
int main()
{char arr[] { a,b,c,d,e,f };//strlen计算的是字符串的长度printf(%zd\n, strlen(arr)); //以字符形式存入数组从第一个字符a向后数直到遇到\0,所以会打印随机值printf(%zd\n, strlen(arr 0)); //首地址0还是首地址还是从第一个a向后数直到遇到\0,所以会打印随机值//printf(%zd\n, strlen(*arr)); err 错误//printf(%zd\n, strlen(arr[1]));err 错误printf(%zd\n, strlen(arr)); //还是从第一个数组还是数打印随机值printf(%zd\n, strlen(arr 1));//跳过了整个字符数组从 f 字符之后开始数直到数到 \0 之前随机值printf(%zd\n, strlen(arr[0] 1));//跳过了第一个元素从第二个元素开始数直到数到 \0 之前随机值return 0;
}代码运行结果如下