c语言 数组指针,C语言数组名及指向数组指针的小结
相信不少的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语言数组名及指向数组指针的小结相关推荐
- 数组名与指向数组的指针之间的联系与区别【数据结构】
我们遇到一个非常棘手的问题,这个问题就是,对于一堆数据来说,我们进行存储,放到一个指定的仓库当中,先前我们使用数组加加标的形式进行访问仓库当中的元素位置,但是呢,现在我们使用的是一个指针结构,指针指向 ...
- C语言 指针和数组区别 - C语言零基础入门教程
目录 一.前言 二.指针和数组区别 1.通过 sizeof 获取大小 a.计算数组大小 b.计算指针大小 2.指针和数组赋值方式不同 a.指针赋值 b.数组赋值 3.指针是指针变量,数组是指针常量 三 ...
- C语言数组指针(指向数组的指针)详解
数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...
- 图解C语言中数组指针、指针数组、函数指针、函数指针数组、指向函数指针数组的指针
关于C语言中数组指针.函数指针.指针数组.函数指针数组.指向函数指针数组的指针一直比较绕,稍微整理一下. 到底是指针还是数组? 其实到底是指针还是数组还是看变量名与[]先结合还是*先结合.我们知道C语 ...
- C语言数组指针(指向数组的指针)
数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...
- c语言不能在函数中求数组大小,C语言中数组长度不能用变量定义吗?
翻翻过去那场雪 1.C语言中不支持.C++中支持变长数组(你可以自行度娘变长数组和alloca函数),但是因为其实在栈上分配,不被推荐使用.做为解决方案,你可以使用C式的malloc函数或者C++式的 ...
- 【chatGPT】01 数组、二维数组在不同语言中的存储方式
问:数组在C++中的存储方式是什么?Java呢?Python呢?可以举例吗? C++ 在C++中,数组是连续分配的内存单元,具有相同的类型和大小. C++会将数组的第一个元素存储在指向数组的指针中,因 ...
- C指针4:数组指针(指向数组的指针)
先明确两个概念:(1和2是两个完全不一样的东西) 1.数组指针:如果一个指针指向了数组(该数组就是普通定义的数组),我们就称它为数组指针(Array Pointer).(1强调的是指针) 2.指针数组 ...
- 数组指针——指向数组对象的指针
转载自:数组指针 数组指针--指向数组对象的指针 数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的 ...
最新文章
- GitHub上中国顶尖大学的课程资源共享计划
- vs2008常用操作汇总
- 基于GTID模式MySQL主从复制
- 京东首页302 Found报错 监控宝教你如何第一时间发现
- RSA加密解密简单使用
- 文巾解题 26. 删除有序数组中的重复项
- 你不知道的 20+ Chrome Devtools 技巧!
- MediaStreamTrackAudioSourceNode
- 达芬奇调色软件 18 for Mac
- 使命、愿景、价值观到底有什么区别
- 企业会计准则第34号——每股收益(2006)
- alias rewrite 后出现404,应设置RewriteBase参数
- typora+PicGo上传图片 配置免费图床
- 让windows保持常亮(不息屏,不锁屏,不进入屏保)
- win10如何安装多个jdk并实时进行切换【建议收藏】
- 2019经济寒冬,软件定制开发公司的竞争力在哪里??
- java毕业设计家庭理财管理系统(附源码、数据库)
- c语言程序中*p代表什么,C语言声明指针的时候int*p到底是什么意思? 爱问知识人...
- 对初学者的React Hooks-关于useState和useEffect的大脑友好指南
- sqluldr2-参数大全-中英文对照版
热门文章
- android 全局 socket,学习Android socket通信之如何解决中文乱码
- java如何调用网页_如何使用网页开发自己的app,在网页中的按钮与自己的java代码绑定来实现打电话即javascript代码调用java代码,和java代码来调用javascript代码...
- uniapp 默认的 ‘再按一次退出应用’ 提示语修改方法
- Python 案例001 (有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数)...
- 图片懒加载解决方案 lazyload.js
- sql基线建立-知识准备
- DatagramSocket总是发送UDP数据后无法接收数据
- 分分钟手写http server
- 关于MultipleOutputFormat若干小记
- iOS之深入解析如何构建动态库与framework动态更新