C++中的操作符:sizeof

Version版本

Using built-in specs.
COLLECT_GCC=gcc
...
Thread model: posix
gcc version 9.2.0 (GCC) 

Source源码

#include "iostream"

using namespace std;

int main() {

    char *ptr = NULL;
    double *d_ptr = NULL;
    cout << sizeof(ptr) << endl;  // 8
    cout << sizeof (d_ptr) << endl;  // 8
    char c_arr[10];
    cout << sizeof(c_arr) << endl;  // 10
    cout << sizeof(*c_arr) << endl;  // 1


    double d_arr[10];
    cout << sizeof(d_arr) << endl;  // 80
    cout << sizeof(d_arr) / sizeof(*d_arr) << endl;
    cout << sizeof(*d_arr) << endl;  // 8
    // [] 优先级高于 (type *)
    double *d_arr_ptr[10];  // double [10]数组 double *(d_arr_ptr[10])
    cout << sizeof(d_arr_ptr) << endl;  // 80
    cout << sizeof(d_arr_ptr) / sizeof(*d_arr_ptr) << endl;
    cout << sizeof(*d_arr_ptr) << endl;  // 8 取内容,double
    double (*d_arr_ptr1)[10]; // double [10]类型的指针
    cout << sizeof(d_arr_ptr1) << endl;  // 8
    cout << sizeof(*d_arr_ptr1) << endl;  // 80 取内容,数组

    return 0;
}

Note笔记

char *ptr = NULL;
double *d_ptr = NULL;
cout << sizeof(ptr) << endl;  // 8
cout << sizeof (d_ptr) << endl;  // 8
char c_arr[10];
cout << sizeof(c_arr) << endl;  // 10
cout << sizeof(*c_arr) << endl;  // 1

ptr,d_ptr是指针变量,相当于sizeof(type *),即是求指针的长度,64位操作系统下(以下默认64位平台),8B

c_arr是char类型数组,sizeof(*c_arr)相当与sizeof(char),1B,sizeof(c_arr)即求数组所占内存大小,10B

double d_arr[10];
cout << sizeof(d_arr) << endl;  // 80
cout << sizeof(d_arr) / sizeof(*d_arr) << endl;
cout << sizeof(*d_arr) << endl;  // 8
// [] 优先级高于 (type *)
double *d_arr_ptr[10];  // double [10]数组 double *(d_arr_ptr[10])
cout << sizeof(d_arr_ptr) << endl;  // 80
cout << sizeof(d_arr_ptr) / sizeof(*d_arr_ptr) << endl;
cout << sizeof(*d_arr_ptr) << endl;  // 8 取内容,double
double (*d_arr_ptr1)[10]; // double [10]类型的指针
cout << sizeof(d_arr_ptr1) << endl;  // 8
cout << sizeof(*d_arr_ptr1) << endl;  // 80 取内容,数组

d_arr类似与c_arr.略

d_arr_ptr: []的优先级高,代表的是数组,数组中的元素是指针类型,指针指向double类型,所以sizeof(d_arr_ptr),即数组的大小,80B,sizeof(*d_arr_ptr)即是数组中的第一个元素,指针,8B

d_arr_ptr1是一个指针,指向double [10]类型,所以sizeof(d_arr_ptr1),8B,sizeof(*d_arr_ptr),80B