C中的sizeof要点
对函数使用sizeof,在编译阶段会被函数返回值的类型取代。如:首先要明确sizeof不是函数,也不是一元运算符,它是个类似宏定义的特殊关键字,sizeof();括号内在编译过程中是不被编译的,而是被类型替代。
如int a=8;sizeof(a++);在编译过程中,a的值不会变,只是被替换成类型sizeof(int);结果为4.
如sizeof(a=6);呢,也是一样的转换成a的类型,但是要注意 因为a=6是不被编译的,所以执行完sizeof(a=6);a的值还是8,是不变的!
记住一下结论:
1.unsigned影响的只是最高位bit的意义(正负),数据长度不会被改变的。所以sizeof(unsigned int) == sizeof(int);
2. 自定义类型的sizeof取值等同于它的类型原形。如typedef short WORD;sizeof(short) == sizeof(WORD)。
3. 对函数使用sizeof,在编译阶段会被函数返回值的类型取代。如:
int f1(){return 0;}; cout << sizeof(f1()) <<endl; // f1()返回值为int,因此被认为是int
4. 只要是指针,x86就是4,x64就是8。如:cout < <sizeof(string*) < <endl; // 4
5. 数组的大小是各维数的乘积*数组元素所属类型的大小。如:
char a[] = "abcdef "; int b[20] = {3, 4}; char c[2][3] = { "aa ", "bb "}; int d[][5][3] = {{1,2}}; cout <<sizeof(a) <<endl; // 8 cout <<sizeof(b) <<endl; // 20*4 cout <<sizeof(c) <<endl; // 6 cout <<sizeof(d) <<endl; // 5*3*4 省略第一维时,将后面的相乘
6. 字符数组的sizeof和strlen的区别
char a[10] = "abcde"; cout << strlen(a) << " " << sizeof(a) << endl; // 5 10 char* b = "abcde"; cout << strlen(b) << " " << sizeof(b) << endl; // 5 4
7. 数组名做函数参数时自动退化成指针
int getSize(int a[]){ return sizeof(a); } cout << getSize(a) << endl; // 4,退化成了指针
参考链接:
个性签名:时间会解决一切