C语言sizeof关键字示例详解

时间:2023-01-25 19:55:22

前言

在文章之前,我们需要明白两样东西

1.&数组名,数组名代表的是整个数组,&数组名代表整个数组的地址

2.sizeof(数组名),数组名代表的也是整个数组,但需要注意的是,只有当括号里只有数组名或完全等价于数组名时它表示整个数组

除上述两点以外,出现的数组名都代表数组首地址

一、sizeof关键字

1.简单介绍

sizeof关键字是用来计算数据所占字节的大小,用法是sizeof(),括号里可以是数据类型,也可以是变量,使用时无需任何头文件

2.实例剖析

2.1一维数组

  int a[] = { 1,2,3,4 };
//例子看不懂先去看前言
printf("%d\n", sizeof(a)); //16
//括号里只有数组名,代表整个数组,该数组有四个元素,每个类型为int(占四个字节)
printf("%d\n", sizeof(a + 0));//4或者8
//a代表首元素地址,+0还是地址,地址在32位平台占四个字节,在64位平台占
//八个字节,相当于指针
printf("%d\n", sizeof(*a));//4
//*a代表数组首元素,int类型,4个字节
printf("%d\n", sizeof(a + 1));//4或者8
//a代表首元素地址,+1后还是地址
printf("%d\n", sizeof(a[1]));//4
//表示数组第一个元素
printf("%d\n", sizeof(&a));//4或者8
//&a代表整个数组地址,仍然是地址
printf("%d\n", sizeof(*&a));//16
//*&抵消,相当于a,代表整个数组
printf("%d\n", sizeof(&a + 1));//4或者8
//表示地址
printf("%d\n", sizeof(&a[0]));//4或者8
//表示地址
printf("%d\n", sizeof(&a[0] + 1));//4或者8
//表示地址

2.2字符数组

  char arr[] = { 'a','b','c','d','e','f' };

printf("%d\n", sizeof(arr));//6
//代表整个数组,共6个元素,类型为char
printf("%d\n", sizeof(arr + 0));//4或者8
//表示地址
printf("%d\n", sizeof(*arr));//1
//代表第一个数据a,char类型
printf("%d\n", sizeof(arr[1]));//1
//代表第一个数据a,char类型
printf("%d\n", sizeof(&arr));//4或者8
//表示地址
printf("%d\n", sizeof(&arr + 1));//4或者8
//表示地址
printf("%d\n", sizeof(&arr[0] + 1));//4或者8
//表示地址
  char arr[] = "abcdef";
//字符串末尾存在字符\0,相当于一个字符,其余同上
printf("%d\n", sizeof(arr)); //7

printf("%d\n", sizeof(arr + 0));//4或者8

printf("%d\n", sizeof(*arr));//1

printf("%d\n", sizeof(arr[1]));//1

printf("%d\n", sizeof(&arr));//4或者8

printf("%d\n", sizeof(&arr + 1));//4或者8

printf("%d\n", sizeof(&arr[0] + 1));//4或者8

2.3指针

  char* p = "abcdef";
//p是一个指针变量,它存放的只有a的地址
printf("%d\n", sizeof(p));//4或者8
//p是指针变量,在32位平台占四个字节,在64位平台占八个字节
printf("%d\n", sizeof(p + 1));//4或者8
//地址
printf("%d\n", sizeof(*p));//1
//表示字符a,占一个字节
printf("%d\n", sizeof(p[0]));//1
//p[0]等价于*p
printf("%d\n", sizeof(&p));//4或者8
//指针变量p的地址,仍然是地址
printf("%d\n", sizeof(&p + 1));//4或者8
//表示地址
printf("%d\n", sizeof(&p[0] + 1));//4或者8
//表示地址

2.4二维数组

  int a[3][4] = { 0 };
//二维元素数组名除前言两种情况,代表首元素地址,即一维数组地址
//二维数组首元素是一维数组
//a[0]是二维数组里第一个一维数组的数组名,
printf("%d\n", sizeof(a));//48
//代表整个数组
printf("%d\n", sizeof(a[0][0]));//4
//代表第一个元素
printf("%d\n", sizeof(a[0]));//16
//代表第一行数据的数组名,即第一个一维数组
printf("%d\n", sizeof(a[0] + 1));//4或者8
//a[0]代表第一行数据所在一维数组的数组名,+1,是地址
printf("%d\n", sizeof(*(a[0] + 1)));//4
//代表第一行第二个元素
printf("%d\n", sizeof(a + 1));//4或者8
//地址
printf("%d\n", sizeof(*(a + 1)));//16
//代表第二个一维数组
printf("%d\n", sizeof(&a[0] + 1));//4或者8
//代表第二个一维数组的地址
printf("%d\n", sizeof(*(&a[0] + 1)));//16
//代表第二个一维数组
printf("%d\n", sizeof(*a));//16
//代表一个一维数组
printf("%d\n", sizeof(a[3]));//16
//代表一个一维数组