strlen 和 sizeof 的区别

strlen:(1)函数

   (2)只能用char*作为参数,且必须是以‘’结尾的,不计算

   (3)由于是函数,当数组作为参数时,退化为指针

   (4)运行时才计算
sizeof:(1)运算符,结果类型为size_t

   (2)可以用类型做参数,比如 short f();  sizeof(f())相当于sizeof(short) = 2,如果用在字符数组上,计算

    char aa[] = "abc";
    cout << sizeof(aa) << ' ' << 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类型
 
原文地址:https://www.cnblogs.com/mini-coconut/p/8527236.html