在 C 语言中,strlen
和 sizeof
是两个非常常用的操作符,但它们的作用和用途有很大的不同。下面详细解释这两个操作符:
strlen
strlen
是一个函数,定义在 <string.h>
头文件中,用于计算一个以空字符('\0'
)结尾的字符串的长度。它不包括最后的空字符。
函数原型:
size_t strlen(const char *str);
- 参数:
str
是指向字符数组(字符串)的指针。 - 返回值:返回字符串的长度,即字符串中字符的数量,不包括最后的空字符。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
//%zu用于打印 size_t 类型的变量
printf("Length of str: %zu\n", strlen(str)); // 输出 13
return 0;
}
sizeof
sizeof
是一个编译时运算符,用于获取数据类型或变量在内存中所占的字节数。
- 使用方式:可以直接跟在变量或类型名前使用。
- 返回值:返回类型或变量的大小,单位是字节。
示例:
#include <stdio.h>
int main() {
char c = 'A';
int i = 10;
double d = 3.14;
printf("Size of char: %zu bytes\n", sizeof(c)); // 输出可能是 1
printf("Size of int: %zu bytes\n", sizeof(i)); // 输出可能是 4
printf("Size of double: %zu bytes\n", sizeof(d)); // 输出可能是 8
char str[] = "Hello";
printf("Size of str: %zu bytes\n", sizeof(str)); // 输出是字符串的总字节数,包括'\0'
return 0;
}
补充:sizeof不能重载
sizeof是运算符而不是函数可以从它的使用规则来看,sizeof无需使用sizeof(),而可以直接使用sizeof在后面加数据类型。
#include<stdio.h>
int main()
{
int a = 4;
const char *str1 = "hello World";
char str2[] = "hello World";
printf("%ld\n",sizeof a);
//这里str1是指向字符串的指针,而不是字符串
printf("%ld\n",sizeof str1);
printf("%ld\n",sizeof 4);
//sizeof会计算字符串结束符
printf("%ld\n",sizeof str2);
return 0;
}
sizeof与数组
#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a + 0));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a + 1));
printf("%d\n", sizeof(a[1]));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(*&a));
printf("%d\n", sizeof(&a + 1));
printf("%d\n", sizeof(&a[0]));
printf("%d\n", sizeof(&a[0] + 1));
return 0;
}
解释
数组名的含义
数组名一般为数组首元素地址,但有两个例外
1:sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
2:&数组名,数组名表示整个数组,取出的是整个数组的地址
1.数组名单独放在sizeof内部,计算整个数组的大小(4*4=16)
2.数组名没有单独放在sizeof内部,此时数组名为首元素地址,a+0还是数组首元素地址,地址大小为8字节
3.对数组首元素地址解引用,得到的是数组首元素,数组首元素类型为int,大小为4字节
4.a+1为数组首元素地址+1,地址大小为8字节
5.a[1]计算第二个元素大小,由于该元素类型为int,所以结果为4字节
6.&a取出的为整个数组的地址,但数组的地址也是地址,地址大小不会改变(不会因为是数组地址就变大或是char类型的变量就变小),大小就是8字节
7.(1).*&相互抵消sizeof(*&a)==sizeof(a),计算的为整个数组的大小
(2).&a先取出整个数组的地址
而*(解引用操作符)到底访问多少由指针类型决定,此时指针的类型为int(*)[4],故访问整个数组
8.*&a访问的是整个数,此时&a+1计算的是a数组后面的那个地址,地址大小为8字节
9.数组首元素地址,大小8
10.数组第二个元素的地址,大小8