服务端视角的C++从入门到精通(十九)

114 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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,就很容易理解了吧。那么,既然是指针,它必然指向一地址空间,这块地址空间的大小,由指针的类型决定。这里其实就是一个3×63×6大小的二维数组,而这个二维数组的类型就是double*,即double类型的指针。所以,*c很显然就打印的是二维数组的大小,即3×6×8=1443×6×8=144**c根据我们讲的原则,数组就是指针嘛,而二维数组,默认是行优先的,所以这里可以理解为取了一行的大小,也就是6×8=486×8=48。后面两个就更容易理解了,double*是指针,所以是8double是基本数据类型,双精度浮点数,占8字节。