携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情
讲讲sizeof(中)
sizeof
#include <stdio.h>
#include <iostream>
using namespace std;
void f(int *i, int n)
{
for (int j = 0; j < n; j++)
{
cout << i[j] << " ";
}
cout << endl;
}
void testSizeof()
{
int b[] = {1, 2, 3};
f(b, sizeof b / sizeof(int));
double *(*c)[3][6];
cout << sizeof(c) << endl;
cout << sizeof(*c) << endl;
cout << sizeof(**c) << endl;
cout << sizeof(***c) << endl;
cout << sizeof(****c) << endl;
}
int main(){
testSizeof();
return 0;
}
以上代码运行后输出的内容是:
1 2 3
8
144
48
8
8
f函数的入参其实是C语言中向函数传递数组的标准姿势:指针+长度。其中指针指示首地址,长度则代表了属于该数组的可访问地址空间。从sizeof b的用法里也可以看出,sizeof就是一个地地道道的运算符,因为函数是不可能这么用的。而sizeof b则代表求b所占内存空间的大小,这个在编译期就是已经可以知道的了,因为b在上面已经被显式初始化为一个局部变量,也就是一个具有3个元素的int数组。sizeof(int)就是求int这一基本数据类型的大小。这两者通过除法组合在一起,就成了数组的长度。
对于double *(*c)[3][6]来说,这里面其实牵扯了多种知识,我们一层层地看。首先,有()肯定先要先看,这在哪个语言里都是如此,()的优先级是最高的。在这里,就可以认为c其实本质上就是个指针。所以,c打印出来8,就很容易理解了吧。那么,既然是指针,它必然指向一地址空间,这块地址空间的大小,由指针的类型决定。这里其实就是一个大小的二维数组,而这个二维数组的类型就是double*,即double类型的指针。所以,*c很显然就打印的是二维数组的大小,即。**c根据我们讲的原则,数组就是指针嘛,而二维数组,默认是行优先的,所以这里可以理解为取了一行的大小,也就是。后面两个就更容易理解了,double*是指针,所以是8,double是基本数据类型,双精度浮点数,占8字节。