strlen:(1)函数
(2)只能用char*作为参数,且必须是以‘\0’结尾的,不计算\0
(3)由于是函数,当数组作为参数时,退化为指针
(4)运行时才计算
sizeof:(1)运算符,结果类型为size_t
(2)可以用类型做参数,比如 short f(); sizeof(f())相当于sizeof(short) = 2,如果用在字符数组上,计算\0
char aa[] = "abc";
cout << sizeof(aa) << '\t' << strlen(aa) << endl;
输出为 4和3
(3)数组作为参数时,不退化
(4)大多数程序在编译的时候就计算sizeof
(5)sizeof只能计算静态数组的大小,不能计算动态分配的数组的大小
实例(经典考题):
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4 a为指针
cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量
解析:首先要理解 double* (*a)[3][6],意思是定义一个二维数组,这个数组的每个元素都是指针,这个数组的数组名是*a, a是指向这个数组首地址的指针。所以a是一个指向一个三行六列double指针的数组的指针的指针,*a是3行6列数组的首地址,**a就是直线一维具有6个double*元素数组的首地址,***a是double*的指针,****a是double类型