相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址。

现在有这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地址,就是指针的指针,

即二级指针嘛!当然这样的结论是错误的,不然这篇笔记也就没有意义了。

下面我们来逐步分析,下面是一段验证这个问题的代码

Code:#include

intmain()

{

inta[10];

printf("a:/t%p/n", a);

printf("&a:/t%p/n", &a);

printf("a+1:/t%p/n", a+1);

printf("&a+1:/t%p/n", &a+1);

return0;

}

大家可以编译运行一下,我的输出的结果是:

Code:/*

a:          0012FF20

&a:         0012FF20

a+1:        0012FF24

&a+1:       0012FF48

*/

a和&a指向的是同一块地址,但他们+1后的效果不同,a+1是一个元素的内存大小(增加4),而&a+1增加的是整个数组的内存

大小(增加40)。既a和&a的指向和&a[0]是相同的,但性质不同!

读到这里,有很多朋友已经明白其中的机制了,如果还是有些模糊,请继续往下看

Code:intmain()

{

inta[10];

printf("%d/n",sizeof(a));

return0;

}

这段代码会输出整个数组的内存大小,而不是首元素的大小,由此我们是否联系到,sizeof(a)这里的a和

&a有些相同之处呢?!  是的,没错,&a取都得是整个数组的地址!既数组名取地址等价于对数组取地址。

好了,让我们总结一下,如果你还是不太理解,不用担心,下面的概念很清晰

其实a和 &a结果都是数组的首地址,但他们的类型是不一样。

a表示&a[0],也即对数组首元素取地址,a+1表示首地址+sizeof(元素类型)。

&a虽然值为数组首元素地址,但类型为:类型 (*)[数组元素个数],所以&a+1大小为:首地址+sizeof(a)。

还有这篇文章最初提到的指针的指针的那个错误结论,其实即使不懂上述内容,也应该判断出结论是错误的,大家应该在了解数组名

即是数组的首地址的同时,也要知道,数组名仅仅是“相当”于指针,而并非真的是指针,数组名是只是个常量(一个值为数组首元素

地址的常量),所以不能进行++或者--运算。而常量更是无法取地址的,而之所以有&a,其实这里的a的意义早已经不是当初那个数组

名了,它此时代表了整个数组。

C语言数组首地址和数组名取地址区别

2010年11月24日 11:51申明:本文系原创,转载时请注明出处,本人保留追究责任的权利。

c语言 数组指针,C语言数组名及指向数组指针的小结相关推荐

  1. 数组名与指向数组的指针之间的联系与区别【数据结构】

    我们遇到一个非常棘手的问题,这个问题就是,对于一堆数据来说,我们进行存储,放到一个指定的仓库当中,先前我们使用数组加加标的形式进行访问仓库当中的元素位置,但是呢,现在我们使用的是一个指针结构,指针指向 ...

  2. C语言 指针和数组区别 - C语言零基础入门教程

    目录 一.前言 二.指针和数组区别 1.通过 sizeof 获取大小 a.计算数组大小 b.计算指针大小 2.指针和数组赋值方式不同 a.指针赋值 b.数组赋值 3.指针是指针变量,数组是指针常量 三 ...

  3. C语言数组指针(指向数组的指针)详解

    数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...

  4. 图解C语言中数组指针、指针数组、函数指针、函数指针数组、指向函数指针数组的指针

    关于C语言中数组指针.函数指针.指针数组.函数指针数组.指向函数指针数组的指针一直比较绕,稍微整理一下. 到底是指针还是数组? 其实到底是指针还是数组还是看变量名与[]先结合还是*先结合.我们知道C语 ...

  5. C语言数组指针(指向数组的指针)

    数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...

  6. c语言不能在函数中求数组大小,C语言中数组长度不能用变量定义吗?

    翻翻过去那场雪 1.C语言中不支持.C++中支持变长数组(你可以自行度娘变长数组和alloca函数),但是因为其实在栈上分配,不被推荐使用.做为解决方案,你可以使用C式的malloc函数或者C++式的 ...

  7. 【chatGPT】01 数组、二维数组在不同语言中的存储方式

    问:数组在C++中的存储方式是什么?Java呢?Python呢?可以举例吗? C++ 在C++中,数组是连续分配的内存单元,具有相同的类型和大小. C++会将数组的第一个元素存储在指向数组的指针中,因 ...

  8. C指针4:数组指针(指向数组的指针)

    先明确两个概念:(1和2是两个完全不一样的东西) 1.数组指针:如果一个指针指向了数组(该数组就是普通定义的数组),我们就称它为数组指针(Array Pointer).(1强调的是指针) 2.指针数组 ...

  9. 数组指针——指向数组对象的指针

    转载自:数组指针 数组指针--指向数组对象的指针 数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的 ...

最新文章

  1. GitHub上中国顶尖大学的课程资源共享计划
  2. vs2008常用操作汇总
  3. 基于GTID模式MySQL主从复制
  4. 京东首页302 Found报错 监控宝教你如何第一时间发现
  5. RSA加密解密简单使用
  6. 文巾解题 26. 删除有序数组中的重复项
  7. 你不知道的 20+ Chrome Devtools 技巧!
  8. MediaStreamTrackAudioSourceNode
  9. 达芬奇调色软件 18 for Mac
  10. 使命、愿景、价值观到底有什么区别
  11. 企业会计准则第34号——每股收益(2006)
  12. alias rewrite 后出现404,应设置RewriteBase参数
  13. typora+PicGo上传图片 配置免费图床
  14. 让windows保持常亮(不息屏,不锁屏,不进入屏保)
  15. win10如何安装多个jdk并实时进行切换【建议收藏】
  16. 2019经济寒冬,软件定制开发公司的竞争力在哪里??
  17. java毕业设计家庭理财管理系统(附源码、数据库)
  18. c语言程序中*p代表什么,C语言声明指针的时候int*p到底是什么意思? 爱问知识人...
  19. 对初学者的React Hooks-关于useState和useEffect的大脑友好指南
  20. sqluldr2-参数大全-中英文对照版

热门文章

  1. android 全局 socket,学习Android socket通信之如何解决中文乱码
  2. java如何调用网页_如何使用网页开发自己的app,在网页中的按钮与自己的java代码绑定来实现打电话即javascript代码调用java代码,和java代码来调用javascript代码...
  3. uniapp 默认的 ‘再按一次退出应用’ 提示语修改方法
  4. Python 案例001 (有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数)...
  5. 图片懒加载解决方案 lazyload.js
  6. sql基线建立-知识准备
  7. DatagramSocket总是发送UDP数据后无法接收数据
  8. 分分钟手写http server
  9. 关于MultipleOutputFormat若干小记
  10. iOS之深入解析如何构建动态库与framework动态更新