注:不知具体原因,在我的机器上地址的位数是48,占用了8个字节,在这个已知条件下进行分析。
1.double c[3][6] 直接声明的二维数组
是一块连续的内存空间,大小3×6×8 = 144字节;
double c[3][6];
cout<<(void*)c<<endl;
cout<<c<<endl;
cout<<c[0]<<endl;
cout<<&c[0][0]<<endl;
cout<<&c[0][1]<<endl;
cout<<&c[0][5]<<endl<<endl;
cout<<c[1]<<endl;
cout<<&c[1][0]<<endl;
cout<<"size:"<<endl;
cout<<sizeof(c)<<endl;//数组的最开始
cout<<sizeof(*c)<<endl;//相当于c[0] 表示一维的数组
cout<<sizeof(**c)<<endl;//相当于c[0][0]指向一个具体的元素
//再多层数的指针就没有具体意义了
输出如下:
0x7ffde665ca80
0x7ffde665ca80
0x7ffde665ca80
0x7ffde665ca80
0x7ffde665ca88
0x7ffde665caa8
0x7ffde665cab0
0x7ffde665cab0
size:
144
48
8
2. double* c[3][6];存储指针的二维数组
double* c[3][6];
cout<<(void*)c<<endl;
cout<<c<<endl;
cout<<c[0]<<endl;
cout<<&c[0][0]<<endl;
cout<<&c[0][1]<<endl;
cout<<&c[0][5]<<endl<<endl;
cout<<c[1]<<endl;
cout<<&c[1][0]<<endl;
cout<<"size:"<<endl;
cout<<sizeof(c)<<endl;
cout<<sizeof(*c)<<endl;
cout<<sizeof(**c)<<endl;
cout<<sizeof(***c)<<endl;
输出如下:
0x7ffe2f1a66f0
0x7ffe2f1a66f0
0x7ffe2f1a66f0
0x7ffe2f1a66f0
0x7ffe2f1a66f8
0x7ffe2f1a6718
0x7ffe2f1a6720
0x7ffe2f1a6720
size:
144
48
8
8
可以看出与1中double类型的二维数组存储并无区别,只是一个存的是double类型的值,一个存的是指向double类型的指针,所以×××c还是有意义的;
3. double (*c)[3][6];
cout<<"size:"<<endl;
cout<<sizeof(c)<<endl;
cout<<sizeof(*c)<<endl;
cout<<sizeof(**c)<<endl;
cout<<sizeof(***c)<<endl;
输出如下:
8
144
48
8
大小关系虽然明白了,可是却不明白这样定义的一个数组的内存结构是否和1,2完全一样,也不知如何对每个元素赋值。
4经典问题: double* (*c)[3][6];
cout<<"size:"<<endl;
cout<<sizeof(c)<<endl;
cout<<sizeof(*c)<<endl;
cout<<sizeof(**c)<<endl;
cout<<sizeof(***c)<<endl;
cout<<sizeof(****c)<<endl;
输出如下:
size:
8
144
48
8
8
所以说只是例1和例2的区别。
c语言数组与指针的学习与思考
最新推荐文章于 2023-01-15 16:05:43 发布