首先要明确sizeof是运算符不是函数。sizeof()。括号内的内容在编译过程中是不被编译的,而是被替代类型。
如a = 8;sizeof(a),a不管是什么,只是被替换成类型sizeof(int),结果是4.如果sizeof(a=6)呢,也是一样被替换成a的类型int。但要注意a=6是不被编译的,所以执行完sizeof(a=6)后,a的值还是8。是不变的。
请记住一下的几个结论。
1,对函数使用sizeof,在编译阶段会被函数返回值的类型替代。如int f1(){return 0;}
sizeof(f1) == sizeof(int)
2, 只要是指针大小都是4
sizeof(string* ) == 4
3,数组的大小是各维数的乘积*数组元素的大小
string strArr[] = {"adb","eeww","gfdf"};
sizeof(strArr)== 12; // 3维 * string的大小 = 3*4 =12
int ** a[3][4];
sizeof(a) == 3*4*4= 48;// 3*4维 * 指针的大小 = 3*4*4=48;
关于sizeof(string),今天看那本面试宝典的时候看到这个表达式,有点吃惊,书上写着sizeof(string)=4;当时很纳闷,难道分配4个字节大小的内存给string吗?查阅了相关资料得出结论:string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。
sizeof(s tring)=4可能是最典型的实现之一,不过也有sizeof()为12、32字节的库实现。 但是VC6.0测试后sizeof(string)=16.还是跟编译器有关
sizeof 与 strlen的区别:
1,sizeof是运算符strlen是函数
2,sizeof可以用类型做参数,strlen智能用char*做参数并且是以“\0”;strlen返回大小不计算\0;
例1:
char* ss="0123456789";
sizeof(ss) = 4;
sizeof(*ss)= 1;//第一个字符
strlen(ss) = 10;
例2:
char ss[]= "0123456789";
sizeof(ss)= 11;
sizeof(*ss) = 1;
strlen(ss)= 10;
例3:
char ss[100]="0123456789";
sizof(ss)=100;
sizeof(*ss)=1;
strlen(ss)=10;