我们都知道数组名是首元素的地址,但是在某些特殊情况下数组名是代表整个元素的地址。

(1)当&数组名的时候便是代表整个数组名。比如 &arr。

(2) 当数组名单独放在sizeof内部的时候便是代表整个数组。

看一段代码:

int main()
{int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));//16printf("%d\n", sizeof(a + 0));//4/8 个字节printf("%d\n", sizeof(*a));//4printf("%d\n", sizeof(a + 1));//4/8printf("%d\n", sizeof(a[1]));//4printf("%d\n", sizeof(&a));//4/8printf("%d\n", sizeof(*&a));//16printf("%d\n", sizeof(&a + 1));//4/8printf("%d\n", sizeof(&a[0]));//取出首元素的地址 4/8printf("%d\n", sizeof(&a[0] + 1));//第二个元素的地址4/8return 0;
}

sizeof(a)就是数组名单独放在sizeof内部,计算的数组总大小,单位是字节

sizeof(a+0)a是数组名没有单独放在sizeof内部代表首元素地址加0还是首元素的地址 大小是4或者8个字节。

sizeof(*a)a是数组名没有单独放在sizeof内部代表首元素地址其中*是解引用 代表首元素 大小是4个字节。

sizeof(a+1) a是数组名没有单独放在sizeof内部代表首元素地址加1代表a[1]的地址 大小是4个字节。

sizeof(a[1])同上。

sizeof(&a)&a代表整个数组的地址,但是也还是个指针 所以大小为4/8个字节。

sizeof(*&a)&a代表整个数组的地址,*是解引用 相当于*和&抵消 变成sizeof(a)整个数组大小 是16个字节。
sizeof(&a+1)&a代表整个数组的地址,加1代表跳过一个数组,但还是个指针,大小为4/8个字节。

sizeof(&a[0])&a[0]是a[0]的地址 ,大小为4/8个字节。

sizeof(&a[0]+1)其代表的是a[1]的地址,大小为4/8个字节。

相信你们已经初步理解一维数组和开头说的两条准则了。

接下来来挑战一下二维数组。

在平常中我们想象下的二维数组是成表列形式排列但是在内存中地址却是线性的。

我们来看一张图就可以懂了:

上代码:

int main()
{int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };printf("%d\n", sizeof(a));//48printf("%d\n", sizeof(a[0][0]));//4printf("%d\n", sizeof(a[0]));//16printf("%d\n", sizeof(a[0] + 1));//4printf("%d\n", sizeof(*(a[0] + 1)));//a[0][1] 大小是:4个字节printf("%d\n", sizeof(a + 1));//printf("%d\n", sizeof(*(a + 1)));//16printf("%d\n", sizeof(&a[0] + 1));//4/8printf("%d\n", sizeof(*(&a[0] + 1)));//16  a[1]printf("%d\n", sizeof(*a));//16 *a - 就是第一行printf("%d\n", sizeof(a[3]));//16return 0;
}

sizeof(a)a单独放在sizeof内部代表整个数组的大小 4*12 48个字节

sizeof(a[0][0])代表首元素 大小为4个字节。

sizeof(a[0])a[0]是第一行地址的数组名 ,你可以想象成一个一维数组 ,其数组名单独放在了sizeof内部,所以计算的是第一行的大小 ,4*4 16个字节。

sizeof(a[0]+1)a[0]是第一行地址的数组名,但是有+1的存在没有单独放 所以代表的是a[0][0]的地址,+1就是a[0][1]的地址,大小为4或8个字节。

sizeof(*(a[0]+1))(a[0]+1)同上,*是解引用所以是a[0][1]元素的大小,大小4个字节。

sizeof(a+1)a没有单独放在sizeof内部所以a代表的是第一行数组(相当二维降一维)+1代表是第二行数组 大小16个字节。

sizeof(*(a+1))*(a+1)相当于a[1]第二行数组,所以大小为16字节;

sizeof(&a[0]+1)相当于取出第一行地址 再加1 指向第二行地址 ,还是个指针,所以是4或者8个字节。

sizeof(*(&a[0] + 1)) &a[0]是第一行地址+1是第二行地址 再解引用,相当于a[1],大小为16个字节。

sizeof(*a)   *a -- *(a+0) -- a[0]  大小是16个字节。

sizeof(a[3])有人会说 越界访问 , 但其实sizeof不在乎,根据a[0] a[1] a[2] 推断是 16个字节。

好了 这期分享就到这里啦

数组名 和数组名的理解相关推荐

  1. 关于数组名是数组第一个元素的地址的理解

    在看小甲鱼的C语言教学视频中的指针与数组的过程中有一段话我很难理解,"数组名是数组第一个元素的地址",我纠结的是数组名字为什么会是地址,a[ ]和地址的那一大串我实在是无法将他们划 ...

  2. C++指针数组、数组指针、数组名及二维数组技巧汇总

    本文较为详细的分析了关于理解C++指针数组,数组指针,数组名,二维数组的一些技巧.是比较重要的概念,相信对于大家的C++程序设计有一定的帮助作用. 一.关于数组名 假设有数组: int a[3] = ...

  3. C++—— 数组名与向量名

    首先说一下自己的理解,然后参考理解 1.数组名代表数组的第一个元素的首地址 2.向量名代表这个容器的名字,&向量名表示这个容器的首地址 3.当拷贝给相同类型的其他变量时,采用值拷贝,即* 地址 ...

  4. 21 11 7 C语言学习总结(数组越界,数组名作为函数参数,数组名)

    一 数组越界 数组的下标是有范围限制的 数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的 ...

  5. C++二维数组名与数组指针的思考

    二维数组名和数组指针可以当做一个东西用,但两者之间的含义是不同的. 二维数组名是一个指向数组中所有元素的指针,而数组指针是一个行指针.体现在sizeof()上的不同. #include <ios ...

  6. php指定键名排序,php二维数组指定其键名对其排序的方法

    安利个小李子先 $arr=[ '2'=>'red', '5'=>'green', 'name'=>'tom' ]; $other=[ '5'=>'new red', 'name ...

  7. C语言中“数组名”和“数组名”

    C语言中 数组名 和 &数组名 == 实验环境 == 1. 编译器:gcc 5.4.0 2. 操作系统:Ubuntu 16.04 x86_64 缘起 本以为此知识点我已熟练掌握,可是最近应用的 ...

  8. php重置下标有什么用,怎么在PHP中删除空数组并重置数组键名

    怎么在PHP中删除空数组并重置数组键名 发布时间:2021-03-19 17:06:33 来源:亿速云 阅读:60 作者:Leah 本篇文章给大家分享的是有关怎么在PHP中删除空数组并重置数组键名,小 ...

  9. 剖析数组名、函数名(不是指针常量,更不是指针)

    对于一个数组,如 int a[4];  如果只是给出数组名a,编译器不知道该取该数组的第几个元素,因此编译器不会自动取值,而是返回该数组的首地址(第一个元素的地址).其实,数组名a就是数组本身,并不是 ...

最新文章

  1. android 重绘如何能不闪一下屏幕_浏览器渲染机制——重绘重排
  2. Eclipse 报java.lang.OutOfMemoryError: PermGen space
  3. 微软引入linux内核,微软内部已在讨论Linux内核中加入exFAT的可能性
  4. 如何评判软件测试的效率,如何衡量测试效率,提高测试效率?
  5. 【JEECG技术文档】JEECG在线聊天插件功能集成文档
  6. 挖掘城市ip_企鹅号助力城市品牌IP化进程
  7. Oracle标准审计实战过程详解
  8. Linq To Entity 的分页讨论
  9. javascript学习笔记(十九) 节点的操作
  10. CCF201409-5 拼图(100分)【插头DP+状态压缩】
  11. 面向对象--选课系统作业
  12. 缺少公钥问题的解决方法[转]
  13. 分享盒子直播软件.已测试,网络机顶盒看电视直播哪个软件好(最好用的三款免费直播软件分享)...
  14. DOS系统和Windows系统的联系、对比和发展历程
  15. SpringBoot使用自定义https
  16. VINS-Mono代码解读——视觉跟踪 feature_trackers
  17. 并发,同步,异步以及事件驱动编程的相关技术
  18. e4a 蓝牙温度app_IIOT应用之Arduino无线蓝牙温湿度和距离测量系统
  19. R语言的graphics功能(画图)
  20. 用T5UIC1 4.3寸串口屏做动画

热门文章

  1. JavaWeb——404错误
  2. 转载——神经网络中mAP相关概念
  3. 字节跳动(上海抖音)面经
  4. 详解HTML的相对路径写法
  5. 2019计算机小高考成绩,小高考没过怎么办 2021小高考难度如何
  6. 2020知道python答案_2020知道智慧树Python程序设计答案
  7. 微信文章图片破解防盗链
  8. Dcloud H5+微信登录功能
  9. 软件测试的压力测试的性能指标,压力测试主要指标有哪些
  10. laravel学习1.0