这是在x64环境下输出的
#include <stdio.h>
//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小
//&数组名,数组名表示整个数组。取出的是整个数组的地址
//除此之外,所有的数组名都是数组首元素的地址
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16
//4个元素,一个整形一个字节,4*4=16
printf("%d\n", sizeof(a + 0));//8
//这个就是首元素地址
printf("%d\n", sizeof(*a));//4
//a是首元素地址,然后解引用,*a就是首元素,大小就是4字节
printf("%d\n", sizeof(a + 1));//8
//第二个元素的地址,首元素地址+1
printf("%d\n", sizeof(a[1]));//4
//第二个元素大小
printf("%d\n", sizeof(&a));//8
//&a是整个数组的地址
printf("%d\n", sizeof(*&a));//16
//&a表示整个数组的地址,然后解引用,就是整个数组,16个字节
printf("%d\n", sizeof(&a + 1));//8
//&a是整个数组的地址,然后加一,跳过整个数组,还是一个数组的地址
printf("%d\n", sizeof(&a[0]));//8
//第0个元素的地址
printf("%d\n", sizeof(&a[0] + 1));//8
//第二个元素的地址
下面是用sizeof来计算sizeof的大小,它是会根据环境的变换而变换的
sizeof是size_t类型,就是无符号整形,但是和unsigned又有点区别,unsigned是不会根据环境的改变而改变的
虽然 size_t
和 unsigned int
都表示整数类型,但它们是不同的类型。 size_t
是无符号整数类型,通常被用于表示内存中对象的大小或数量,例如数组的大小。而 unsigned int
也是无符号整数类型,但它的大小通常是固定的,而不是根据特定的平台或编译器而变化。在一些情况下,这两种类型可以互相转换,但在其他情况下,它们不能互换使用。例如,如果你想要使用 sizeof
运算符来获取一个对象的大小,那么你应该使用 size_t
类型而不是 unsigned int
类型。
x64
strlen需要\0,但是sizeof不需要
把上面相同的代码换成strlen来输出,比较两者的不同