C语言中“数组名”和“数组名”
C语言中 数组名
和 &数组名
== 实验环境 ==
1. 编译器:gcc 5.4.0
2. 操作系统:Ubuntu 16.04 x86_64
缘起
本以为此知识点我已熟练掌握,可是最近应用的时候还真给记混淆了。所以写篇文章加深印象。
Show me the code
废话少说,show me the code
.
#include <stdio.h>int main(void)
{int array[5] = {0};printf("1. array = %p\n", array); printf("2. &array = %p\n", &array); printf("3. &array[0] = %p\n", &array[0]); printf("4. array + 1 = %p\n", array + 1);printf("5. &array[0] + 1 = %p\n", &array[0] + 1);printf("6. &array + 1 = %p\n", &array + 1);printf("7. sizeof(array) = %lu\n", sizeof(array)); return 0;
}
请你思考一分钟,然后再看答案。
…
…
运行结果是:
讨论
在绝大多数关于数组的表达式中,数组名代表指针常量,这个指针指向数组首个元素。从数值上讲,数组名表示的值就是首个元素的地址。 从结果的第1行和第3行,第4行和第5行,都可以验证这一点,即array
的值就等于&array[0]
的值。
刚才已经说过,数组名代表指针常量,且这个指针指向数组首个元素。当对这个指针进行加减的时候,以一个数组元素为颗粒度。例子中的数组元素为整型,所以数组名加1时地址加4. 对比第4行和第1行,可以验证。
但是,在以下2种语境中,数组名并不是上面说的指针常量。
1. sizeof(数组名)
2. &数组名
对于1,sizeof(数组名)
返回整个数组的长度,而不是指针常量的长度。 结果的第7行,返回20(=4*5),而不是返回8(因为地址宽度是64位,所以指针占8字节)。
对于2,对数组名取地址所产生的值的类型是一个指向整个数组的指针,而不是一个指向指针常量的指针。所以&array
的类型是指向整个数组的指针,而array
是指向array[0]
的指针,虽然在数值上相同(结果的第1行和第2行),但是在类型上不同。
正因为它们的类型不同,所以在加1或减1的时候,颗粒度不同。array
以一个数组元素为颗粒度,例子中的数组元素为整数,所以array
加1时地址加4(对比结果的1、4两行);而&array
以整个数组为颗粒度,例子中的数组为有5个元素的整型数组,所以&array
加1时,地址加20(对比结果的2、6两行)。
总结
绝大多数情况下,数组名代表指针常量,这个指针常量指向数组首个元素。从数值上讲,数组名的值就是首个元素的地址。当对这个指针常量进行加减的时候,以一个数组元素为颗粒度。
在
sizeof(数组名)
和&数组名
这2种语境中,数组名并不是上面说的指针常量。sizeof(数组名)
返回整个数组的长度,而不是指针常量的长度。&数组名
的类型是一个指向整个数组的指针,而不是一个指向指针常量的指针。数组名
和&数组名
虽然在数值上相同,但是在类型上不同——数组名
是指向首个元素的指针,&数组名
是指向整个数组的指针。在指针加减整数的时候,前者以一个元素为颗粒度,后者以整个数组为颗粒度。
参考资料
https://blog.csdn.net/wangkeyen/article/details/50650000
C语言中“数组名”和“数组名”相关推荐
- c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc
C语言中动态分配二维数组复习过程.doc C语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的.C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C ...
- c语言中数组的概念及作用,详解C语言中的指针与数组的定义与使用
指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...
- 二维数组在c语言中的作用,C语言中的二维数组
1.二维数组的定义和引用 一. 数据类型 数组名[常量表达式1][常量表达式2]; (1)假如有个二维数组array[n][m],则行下标的取值范围0~n-1 (2)列下标的取值范围0~m-1 (3) ...
- C语言中字符串和字符数组的区别
C语言中字符串和字符数组的区别 1.基本概念 2.代码分析 3.总结 1.基本概念 字符串和字符数组很相似,但是有本质上的区别. (1) C语言中,字符串是双引号括起来的单个或多个字符的集合,编译器自 ...
- c语言如何赋值空字符串,c语言中如何给字符串数组赋值
c语言中如何给字符串数组赋值 1.问题 这是我写的 struct student { int x; char name[10]; }; void main() { student st: st.nam ...
- IOS笔记-C语言中的指针与数组
1.指针与数组 1)指针与一维数组 i.数组指针(指向数组元素的指针) 类型 *指针变量名: 指针定义完成后要初始化(不想让指向任何内容,=0,=NULL) int a[10]; int *p = ...
- c语言数组的使用步骤,C语言中为什么要使用数组?详细图解数组的使用
唉,有这么多不同主题的书.在哪里才能找到有关中国音乐的书呢? 数组是可以在内存中连续存储多个元素的结构 数组中的所有元素必须属于相同的数据类型 1.在计算机内存中,同一数组的所有元素按下标顺序依次存放 ...
- c不能做oracle关键字,C语言中的关键字不能作变量名,但可以作为函数名。
语言中目的工助学中心的立勤成是(. 个运在整程中输过,键字它们是(,个单重要的据是有三非常. 作变作包括运输费率.自动下级部门继承,目选择不能不同的科,目部门的折旧科设置上级.故用固定管理资产系统不 ...
- C语言中自定义函数返回数组类型
相信大家在C语言中写一些函数的返回值用到了void,int,char,double等等,但是好像没有遇到数组类型的,确实在C语言直接返回数组类型,是会报错的.具体的原因只要大家学习了指针还是可以理解的 ...
- C语言中常用的字符数组函数
所有的字符数组处理函数都包括在 <string.h>这个头文件中 一.strlen 函数 原型:size_t strlen(char const* string); 在C语言中如何计算一个 ...
最新文章
- Atitit.注册跟个登录功能的实现attilax总结obo
- 【机器学习】xgboost系列丨xgboost原理及公式推导
- 2014年工作中遇到的20个问题:120-140
- Gitee ssh 公钥配置好后,仍然 permission denied 的排查过程及解决方法
- Elasticsearch过滤与聚合的先后顺序java实现
- Eclipse中显示文件字符乱码
- php where 不包含,php – 除非它们包含“where”或“like”子句,否则不允许删除
- Android之Bundle类
- Java笔记-使用logback按天生成日志并按等级进行分类
- 在3D场景中显示汉字
- 张宇1000题高等数学 第十、十一、十二章 一元函数积分学的应用——几何应用、积分等式与积分不等式、物理应用
- socket can 编程
- Java包装类相关知识点
- php微信摇一摇,怎样使用JS+H5实现微信摇一摇
- Centos7 -- 用三种方法设置代理服务器上网
- this的三种常见用法
- 力扣739:每日温度【C++】
- systemtap工具使用介绍
- 八皇后问题(dfs)
- [基于harbor部署私有仓库] 4 推送镜像到harbor