1.sizeof是运算符,strlen是函数
- strlen需要包含头文件<string.h>,而sizeof不需要。
2.操作数的区别
- sizeof的操作数可以是变量、常量、指针、表达式、类型名、函数名、数组名、函数返回值......。最后操作系统会统一将操作数变成类型来处理,计算这个类型的数据占用多少内存。举例:
- 操作数是字符数组名:计算的是数粗占用的内存空间大小
char cdata[] = {'h','e','l','l','o'}; char str[] = "hello"; printf("sizeof(cdata) =%d\n", sizeof(cdata)); //5: 操作数字符数组名,计算的是字符数组占用空间大小 printf("sizeof(\"hello\")=%d\n", sizeof("hello")); //6: 操作数是字符串,它实际上是字符数组名 printf("sizeof(str) =%d\n", sizeof(str)); //6: 操作数是字符数组,计算的是字符数组占用空间大小
- 操作数是指针:计算的是指针占用的内存空间大小,不论什么类型指针,占用空间都是8
char *p = "hello"; printf("sizeof(p) =%d\n", sizeof(p)); //8: 计算的是字符指针的占用空间大小 printf("sizeof(cahr *)=%d\n", sizeof(char *)); //8: 计算的是字符指针的占用空间大小 printf("sizeof(int *) =%d\n", sizeof(int *)); //8: 计算的是整型指针的占用空间大小
- 操作数是变量或常量:计算的是变量或常量所对应的数据类型的占用空间大小
printf("sizeof(3) =%d\n", sizeof(3)); //4: 计算的是数值3(默认int)的占用空间大小 printf("sizeof(int) =%d\n", sizeof(int)); //4: 计算的是int类型的占用空间大小 printf("sizeof(3.2f) =%d\n", sizeof(3.2f)); //4: 计算的是数值3.2f(float)的占用空间大小 printf("sizeof(float) =%d\n", sizeof(float)); //4: 计算的是float类型的占用空间大小 printf("sizeof(3.2) =%d\n", sizeof(3.2)); //8: 计算的是数值3.2(默认是double)的占用空间大小 printf("sizeof(double)=%d\n", sizeof(double)); //8: 计算的是double类型的占用空间大小
- 操作数是void类型名:void类型的占用空间大小是1
printf("sizeof(void) =%d\n", sizeof(void)); //1: 计算的是void类型的占用空间大小
- 操作数是函数名:总是1
int test(int a){} printf("sizeof(test) =%d\n", sizeof(test)); //1
- 操作数是函数名(实参列表):计算的是函数返回值类型所占用的空间大小
int test(int a){} printf("sizeof(test) =%d\n", sizeof(test(5))); //4: 计算的是函数返回值类型的占用空间大小
- 操作数是字符数组名:计算的是数粗占用的内存空间大小
- strlen的操作数只能是字符指针类型的地址,可以理解为就是字符串。举例:
printf("strlen(\"hello\")=%d\n", strlen("hello")); //5: 计算的是字符串的有效字符长度 char str[] = "hello"; printf("strlen(str) =%d\n", strlen(str)); //5: 计算的是字符串的有效字符长度 char *p = "hello"; printf("strlen(p) =%d\n", strlen(p)); //5: 计算的是字符串的有效有效长度
3.功能的区别
- sizeof是计算操作数占用的内存空间大小
- strlen是计算字符串中有效字符长度(也就是字符串中第一个空字符'\0'之前的长度)