目录

  • 1. 数组名、sizeof(数组名)、&数组名
  • 2. 一维数组的sizeof()
    • 2.1 整型数组的sizeof()
    • 2.2 字符数组的sizeof()
    • 2.3 字符串赋值给字符数组的sizeof()
    • 2.4 字符串赋值给指针的sizeof()
  • 3. 二维数组的sizeof()

1. 数组名、sizeof(数组名)、&数组名

数组名是首元素的地址;例如:arr当参数传递时,arr表示首元素的地址,sizeof(arr)=4
但是在一下这两种情况表示的认知不是首元素地址。

1.sizeof(arr):在sizeof()中,单独数组名出现,表示数组的整个大小,不是首元素地址大小。
2.&arr ,对于取地址数组名,表示的是整个数组的地址。

sizeof():求的是在括号()里面表达式子或者类型的大小,以字节为单位;
strlen():是一个字符串函数,括号里接收是地址,求得该地址往后,碰到\0结束为止的字符个数。

2. 一维数组的sizeof()

前提:32位操作系统下

2.1 整型数组的sizeof()

int a[] = {1,2,3,4};printf("%d\n",sizeof(a));
数组名a表示整个数组的大小,元素类型 int ,有4个元素,所以大小为 4×4 = 16printf("%d\n",sizeof(a+0));
数组名a表示首元素地址,a+0 表示 首元素地址跳过了0个元素的地址;即首元素的地址,地址的大小为:4printf("%d\n",sizeof(*a));
数组名a表示首元素地址,*a对首元素地址解引用表示a[0]的元素,1为int型,大小为:4printf("%d\n",sizeof(*(a+1)));
数组名a表示首元素地址,a+1就是a[1]的地址,*(a+1)对a[1]地址解引用表示a[1]的元素2,为int型,大小为:4printf("%d\n",sizeof(a+1));
数组名a表示首元素地址,a+1表示跳过一个元素的地址,即a[1]的地址,地址的大小为4个字节。结果为:4printf("%d\n",sizeof(a[1]));
a[1]表示下标为 1的元素,该元素类型为int,结果为:4printf("%d\n",sizeof(&a));
&a表示整个数组的地址,并不是数组首元素地址的地址;整个数组的地址还是地址;
结果为:4printf("%d\n",sizeof(*&a));
&a表示整个数组的地址,对整个数组地址解引用 *&a,访问的是整个数组;结果为:16printf("%d\n",sizeof(&a+1));
&a表示整个数组的地址,&a + 1;表示跳过 1个 数组大小的地址,由于还是地址,结果:4printf("%d\n",sizeof(&a[0]));
&a[0],表示的是下标为0元素的地址,结果: 4printf("%d\n",sizeof(&a[0]+1));
&a[0] + 1 表示下标为0的地址,跳过一个元素的地址,即为下标为 1 的地址,和 &a[1]等价;结果为:4

2.2 字符数组的sizeof()

char arr[] = {'a','b','c','d','e','f'};printf("%d\n", sizeof(arr));   6,整个数组的大小printf("%d\n", sizeof(arr+0));  4,arr[0]的地址printf("%d\n", sizeof(*arr));   1,arr[0]的元素printf("%d\n", sizeof(arr[1]));  1,arr[1]的元素printf("%d\n", sizeof(&arr));   4,整个数组地址,本质还是地址printf("%d\n", sizeof(&arr+1));   4,整个数组+1的地址printf("%d\n", sizeof(&arr[0]+1));  4,arr[1]的地址

2.3 字符串赋值给字符数组的sizeof()

char arr[] = "abcdef";相当于 char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0'};printf("%d\n", sizeof(arr));
字符串其实是隐藏了\0,即,在这里数组的大小不是 6 ,而是 7,多了一个\0; 结果:7printf("%d\n", sizeof(arr+0));
arr+0表示&a[0],地址的大小都是4个字节; 结果:4printf("%d\n", sizeof(*arr));
*arr表示a[0],为字符'a',大小为: 1printf("%d\n", sizeof(arr[1]));
arr[1]表示‘b’; 最终结果:1printf("%d\n", sizeof(&arr));
&arr表示整个数组的地址,地址的大小还是:4printf("%d\n", sizeof(&arr+1));
&arr + 1表示跳过一个数组的地址,该地址最终还是地址,虽然是不合法的地址; 结果:4printf("%d\n", sizeof(&arr[0]+1));
&arr[0]+1 表示&arr[1], 结果:4

2.4 字符串赋值给指针的sizeof()

char *p = "abcdef";
看清楚p这是一个字符指针,指向字符串“abcdef”printf("%d\n", sizeof(p));
p是字符指针,表示字符串首地址,指针大小为4个字节; 结果:4printf("%d\n", sizeof(p+1));
p+1表示 字符串第二个元素的地址; 结果:4printf("%d\n", sizeof(*p));
*p表示 字符'a',类型为 char; 结果为;1printf("%d\n", sizeof(p[0]));p[0]表示第一个元素,字符'a',类型为 char; 结果:1printf("%d\n", sizeof(&p));
&p是字符指针p的地址,类型为 char**, 结果:4printf("%d\n", sizeof(&p+1));
&p + 1 表示地址, 最终结果:4printf("%d\n", sizeof(&p[0]+1));
&p[0] + 1表示第二个元素 p[1]的地址; 结果: 4

3. 二维数组的sizeof()

数组名是首元素地址,对于二维数组来说也不例外;
记: sizeof(*a) == sizeof(a[0])
除两个例外

sizeof(arr) 表示整个数组的大小,
&arr,表示整个数组的地址。

把二维数组 arr[n][m],看成 n 个一维数组,每个一维数组有m个元素。

对于二维数组来说:

第 0 行的首元素地址为 arr[0], arr[0],表示二维数组的第 0 行一维数组的数组名
第 1 行的首元素地址为arr[1],arr[1],表示二维数组的第 1 行 一维数组的数组名

第 n行的首元素地址为 arr[n]

arr == arr[0] 二维数组名是首元素的地址,即 第 0 行 一维数组首元素的地址,
arr + 1 ==arr[1],二维数组首元素地址 + 1,表示移动了 1 行,即 第 1 行 一维数组首元素的地址。

arr + n ==arr[n],二维数组首元素地址 + n,表示移动了 n 行,即 第 n 行 一维数组首元素的地址。

int a[3][4] = {0};
二维数组的数组名也是首元素的地址;除两个例外
sizeof(arr) 表示整个数组的大小,
&arr,表示整个数组的地址。printf("%d\n",sizeof(a));
sizeof(a) 表示整个数组的大小,该数组有3×4 = 12 个元素,每个元素类型为 int; 结果: 48printf("%d\n",sizeof(a[0][0]));
arr[0][0]表示第 0 行 第 0 个元素,类型为 int; 结果:4printf("%d\n",sizeof(a[0]));
a[0]表示二维数组第 0 行的一维数组,求一维数组的总大小,该一维数组有4个元素,结果:16printf("%d\n",sizeof(a[0]+1));
a[0] + 1表示二维数组第 0 行的一维数组的数组名,一维数组名+ 1,表示跳过一个元素的地址,即 a[0] + 1,表示 &a[0][1]; 结果:4区分 a+1 与 a[0]+1 与 &a[0]+1printf("%d\n",sizeof(*(a[0]+1)));
*(a[0] + 1),表示a[0][1],类型为 int; 结果:4printf("%d\n",sizeof(a+1));
数组名a是首元素的地址,数组名 + 1 ,在二维数组表示 跳过一行,即第 1行的一维数组的地址; 结果:4printf("%d\n",sizeof(*(a+1)));
*(a+1) 表示第 1 行 的一维数组的地址解引用,即a[1]; 结果:16printf("%d\n",sizeof(&a[0]+1));
&a[0]表示第 0 行一维数组的整个数组的地址,&a[0] + 1,表示跳过了一个一维数组的地址,到达 第 1 行的一位数组的地址,由于第一行一位数组的地址还是地址; 结果:4printf("%d\n",sizeof(*(&a[0]+1)));
*(&a[0]+1)),表示第一行的数组地址解引用; 结果:16printf("%d\n",sizeof(*a));
a == &a[0],即第 0 行的地址,解引用为第 0 行数组的整个大小; 结果:16printf("%d\n",sizeof(a[3]));
a[3]表示第3行的一维数组的数组名,这里越界了,但是sizeof()括号内不参与计算的; 结果:16

【C语言】sizeof(数组名),包括 一维数组、字符数组、二维数组相关推荐

  1. Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标

    *8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置.返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标 题目 题目描述与运行示例 破题 代码 题目 ...

  2. 遍历二维数组_Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  3. PHP常用数组函数(含按键值删除二维数组中的元素)

    // 1.array_search():在数组中搜索键值"red",并返回它的键名 $a=array("a"=>"red"," ...

  4. pythonjson构建二维数组_python后台获取ajax传递的二维数组,保持原有数据结构不变...

    python后台获取ajax传递的二维数组,保持原有数据结构不变. 前台主要程序: arr_data = [[1,2,3],[4,5,6]];//创建二维数组 var json_data = JSON ...

  5. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  6. php把二维数组变为一维,如何将PHP二维数组转换为一维数组

    如何将PHP二维数组转换为一维数组 发布时间:2020-07-22 11:12:05 来源:亿速云 阅读:137 作者:Leah 如何将PHP二维数组转换为一维数组?相信很多没有经验的人对此束手无策, ...

  7. 求二维数组中的最大值和最小值C语言,c语言 写一个子函数要求找出一个二维数组的最大值...

    并且返回两个维 求助 想不出来怎么写 题主的问题问的不够清楚.我假设你说的二维数组里面保存是整数,问的是找到二维数组中的最大值,并且返回一个最大值的位置.函数内部两个for循环遍历数组,能找到最大值和 ...

  8. c语言二维数组对角线输出字符,输出二维数组对角线上的数 c语言 二维数组 对角线相加...

    1.编写程序,把下面的数据输入到一个二维数组中: 25 36 78 13 12 26 8我自己编的,用VISUAL C++6.0 测试过了 #include"stdio.h" vo ...

  9. php 二维数组 根据值 找,PHP编程根据二维数组某个字段的值查找值所在的一维数组...

    /** *根据二维数组某个字段的值查找数组 * @param $index 数组中的key * @param $value 查找的值 */ function seacharr_by_value($ar ...

  10. Nwafu-OJ-1430 Problem a C语言实习题五——5.用指针实现查找二维数组中最大数及其位置

    题目描述 用指针实现:找出二维数组(设3行4列)中的最大数及其位置. 输入 二维数组(设3行4列). 输出 最大数及其位置. 样例输入 1 2 5 4 6 8 7 2 0 2 4 5 样例输出 1 1 ...

最新文章

  1. 机器学习中训练集、验证集和测试集的区别
  2. oracle flex cluster,Oracle Flex ASM和Flex集群
  3. MESSAGE_TYPE_X dump in RSM_DATASTATE_CHECK -6-
  4. 数据结构与算法 / 排序算法 / 堆排序
  5. MassTransit - .NET Core 的分布式应用程序框架
  6. setdefault()方法
  7. Spring For All 顶级Spring综合社区服务平台
  8. “CSDN 2021年度IT技术影响力之星评选”正式开启报名!
  9. python 示例_Python条件类| release()方法与示例
  10. 局域网网管软件_局域网安全管理面临的4大挑战
  11. matplotlib 可视化 —— cmap(colormap)
  12. 【博客搬家】【转】matlab 6.5和7.0中simulink模型的兼容问题
  13. 云桌面计算机被锁定如何解决,桌面布局已锁定怎么解除?电脑桌面便签布局锁定后怎么解除?...
  14. Opencv之人脸识别
  15. 微信小程序实时音视频功能简析(live-pusher与live-player)
  16. 异常解决——Tomcat启动异常:Cannot assign requested address
  17. 1.19.5.3.时态表、关联一张版本表、关联一张普通表、时态表、声明版本表、声明版本视图、声明普通表、时态表函数等
  18. php中跟时间有关的处理(时区设置,计算时间差,获取系统当前时间)
  19. 全网5G最完整的PPT,全面解析什么是5G
  20. ERP流程之父谈ERP软件未来

热门文章

  1. CISP信息安全认证的价值有哪些?
  2. JavaScript入门(二)
  3. ffprobe常用命令总结
  4. Python基础教程之Python 标识符
  5. 新闻撰写是由哪几部分组成?
  6. stew() setfill()
  7. 产品思维的《打胜仗》
  8. python自带rbf函数吗_径向基函数(RBF)神经网络
  9. #私藏项目实操分享# 提高区块链的可扩展性并不需要牺牲安全和去中心化
  10. C语言图形代码:三角、金字塔、圣诞树、爱心