C语言-数据类型的本质

数据类型:固定内存大小的别名

数据类型可以看做是一个模板,可以通过不同的模板来创建不同的数据类型。例如,int模板可以创建int数据类型,char模板可以创建char数据类型,并且它们在内存中的大小是和模板的大小是一致的,并且是固定的。因而数据类型的作用是为编译器预算固定的内存大小

int a; // 通过`int`模板创建了`int`数据类型 内存大小是4
char b; // 通过`char`模板创建了`char`数据类型 内存大小是1
int *p = nullptr; // 通过`int *`模板创建了`int *`数据类型 内存大小是8

数据类型大小的获取:使用sizeof

printf("sizeof(a):%d\n", sizeof(a));
printf("sizeof(b):%d\n", sizeof(b));
printf("sizeof(p):%d\n", sizeof(p));
打印结果:
sizeof(a):4
sizeof(b):1
sizeof(p):8
示例代码
int array[3] = {1, 2, 3};
printf("array:%p\n", array);
printf("&array:%p\n", &array);
printf("array + 1: %p\n", array + 1);
printf("&array + 1: %p\n", &array + 1);
打印结果:
array:0x7ffee0d6c79c
&array:0x7ffee0d6c79c
array + 1: 0x7ffee0d6c7a0
&array + 1: 0x7ffee0d6c7a8
示例代码分析:

因为数组名的地址是数组首个元素的地址,也是数组的地址,所以通过array&array方式获取的地址是一致的。那么为什么在加1以后,它们的地址不一致呢?因为array&array代表的含义是不一致的,array指的是数组首个元素的地址,那么在加1以后,指针变指向下一个元素,而该数组的元素是int,那么下一个地址便是首个元素的地址加4,因此看打印结果可知,arrayarray + 1之间差4。而&array指的是获取的地址是整个数组的地址,该数组包含3个int类型的元素,那么该数组的大小是3 * 4 = 12个字节,因此&arrat + 1的地址值与&array的地址值相差14。

你可能感兴趣的:(C语言-数据类型的本质)