什么是sizeof运算符?
sizeof是一个C++编程语言中的运算符,其作用是计算指定变量、类型或对象所占用的内存大小(以字节为单位)。sizeof返回的是一个整数值,可以用于动态分配内存或者为数据结构中的元素分配空间。
例如,使用sizeof运算符可以确定一个int数据类型所占用的字节数,以便在内存中分配足够的空间来存储该变量。语法格式如下:
sizeof(expression)
其中,expression可以是任何有效的C++表达式,例如变量、常量、指针等。
在C++中,sizeof运算符的返回值是一个size_t类型的无符号整数。这个值取决于所计算的表达式的类型及其在特定编译器环境中的实现情况。
什么是strlen函数?
strlen函数是一个C标准库函数,用于计算字符串的长度。它通过遍历字符数组并计算字符数量,直到遇到字符串结束标志'\0'为止。它的定义如下:
size_t strlen(const char *str);
其中,str
是要计算长度的字符串,函数返回值是字符串的长度,不包括结束标志'\0'。该函数可以用于不定长字符串的处理,如动态内存分配、字符串复制等操作。
数组存放字符的两种形式
//创建两个数组来存放字符
char arr1[] = "abcdef";
char arr2[] = { 'a','b','c','d','e','f' };
用编译器来验证
让我们在vs2022上分别使用sizeof和strlen来求其字符长度
1.使用sizeof操作符对arr1和arr2求长度
我们可以看到结果是不一样的,这是因为arr1中会自动在末尾加上字符‘\0’,实际上有7个字符,而arr2真实际字符就是6个
2.用strlen函数对arr1和arr2求长度(首先要先包含string.h头文件)
我们可以看到结果又不一样,且第二个数字比第一个大得多,这又是为什么呢?
两种字符数组的区别
char arr1[] = "abcdef";
char arr2[] = { 'a','b','c','d','e','f' };
arr1和arr2都是字符数组,但是有一个重要的区别:arr1是一个字符串字面量,而arr2是一个普通的字符数组。字符串字面量是一种特殊的字符数组,它以一个空字符’\0’结尾,用来表示字符串的结束。因此,arr1实际上包含了7个字符:‘a’,‘b’,‘c’,‘d’,‘e’,‘f’和’\0’。而arr2只包含了6个字符:‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,没有’\0’。
strlen函数的作用是计算一个字符串的长度,它会从给定的地址开始,一直遍历到遇到’\0’为止。所以,strlen(arr1)会返回6,因为它只计算了’\0’之前的字符。但是strlen(arr2)会返回一个不确定的值,因为它会继续遍历arr2之后的内存,直到找到一个’\0’或者发生内存访问错误为止。在你的例子中,strlen(arr2)返回了33,这意味着在arr2之后的内存中有27个非零字符,然后才遇到了一个’\0’。
这就是为什么第二个打印出来的结果是33。如果想让arr2也作为一个字符串处理,需要在它的末尾加上一个’\0’,例如:
char arr2[] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘\0’ };
这样strlen(arr2)就会返回6了。