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,退化成了指针

参考链接:

1. 博客园_漫步云端-C++ sizeof() 和一道面试题

2. CSDN_liming0931-C语言面试题sizeof的注意点

原文地址:https://www.cnblogs.com/lfri/p/12420679.html