一、解说
1、sizeof是运算符,strlen是函数
2、sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int 类型。该类型能保证足够容纳所建立的大对象的字节大小
3、sizeof可以用类型作参数,strlen只能用char *做参数,且必须是以‘\0’结尾,此外sizeof还可以用函数来做参数
4、数组做sizeof的参数不退化,传递给strlen就退化为指针
char str[100]="123";
sizeof(str)=100;
5、strlen函数的计算结果在运行的时候才能计算出来,用来计算字符串长度,而sizeof操作符计算的是类型占内存的大小。
7、sizeof后如果是类型要加括号,如果是变量可以不用加括号。因为sizeof是个操作符而不是函数的原因。
8、数组作为参数传递给函数时的是指针而不是数组,传递的是数组的首地址,如fun(char a[8])、fun(char a[])都等价于fun(char *a),
9、sizeof计算结构变量或类的大小时要注意考虑数据对齐的问题,C++在处理数据时经常把结构变量中的成员大小按照4或8的倍数计算,这就叫数据对齐,data alignment
二、示例
1.常规
char str1[] = “Hello” ;
char str2[5] = {'H','e','l','l','o'};
char str3[6] = {'H','e','l','l','o','\0'};
char *p1 = "Hello";
char *p2[]={"hello","world"};
int n = 10;
int *q = &n;
sizeof (str1 ) = 6 (自动加了'\0')
strlen (str1 ) = 5 (字符串的长度) //不把'\0'计算在内
sizeof (str2 ) = 5 (字符数组的大小)
strlen (str2) = 未知 (该字符串缺少结束符'\0')
sizeof (str3) = 6 (字符数组的大小)
strlen (str3) = 5 (该字符串的长度为5)
sizeof ( p1 ) = 4 (p1是一个指针,大小为4)
sizeof ( p2 ) = 8 (p2是长度为2的字符串数组)
sizeof ( n ) = 4 (整型大小为4)
sizeof ( q ) = 4 (q是一个指针,大小为4)
2.动态分配内存
int *p = (int *)malloc( 100 );
sizeof ( p ) = 4 (p是一个指针,大小为4)
3.函数参数
void Function1( char p[],int num ){
sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)
}
void Function2( int p[],int num ){
sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)
}