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两行)。

总结

  1. 绝大多数情况下,数组名代表指针常量,这个指针常量指向数组首个元素。从数值上讲,数组名的值就是首个元素的地址。当对这个指针常量进行加减的时候,以一个数组元素为颗粒度。

  2. sizeof(数组名)&数组名 这2种语境中,数组名并不是上面说的指针常量。 sizeof(数组名)返回整个数组的长度,而不是指针常量的长度。&数组名 的类型是一个指向整个数组的指针,而不是一个指向指针常量的指针。

  3. 数组名&数组名虽然在数值上相同,但是在类型上不同——数组名是指向首个元素的指针,&数组名是指向整个数组的指针。在指针加减整数的时候,前者以一个元素为颗粒度,后者以整个数组为颗粒度。

参考资料
https://blog.csdn.net/wangkeyen/article/details/50650000

C语言中“数组名”和“数组名”相关推荐

  1. c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc

    C语言中动态分配二维数组复习过程.doc C语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的.C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C ...

  2. c语言中数组的概念及作用,详解C语言中的指针与数组的定义与使用

    指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...

  3. 二维数组在c语言中的作用,C语言中的二维数组

    1.二维数组的定义和引用 一. 数据类型 数组名[常量表达式1][常量表达式2]; (1)假如有个二维数组array[n][m],则行下标的取值范围0~n-1 (2)列下标的取值范围0~m-1 (3) ...

  4. C语言中字符串和字符数组的区别

    C语言中字符串和字符数组的区别 1.基本概念 2.代码分析 3.总结 1.基本概念 字符串和字符数组很相似,但是有本质上的区别. (1) C语言中,字符串是双引号括起来的单个或多个字符的集合,编译器自 ...

  5. c语言如何赋值空字符串,c语言中如何给字符串数组赋值

    c语言中如何给字符串数组赋值 1.问题 这是我写的 struct student { int x; char name[10]; }; void main() { student st: st.nam ...

  6. IOS笔记-C语言中的指针与数组

    1.指针与数组 1)指针与一维数组 i.数组指针(指向数组元素的指针) 类型  *指针变量名: 指针定义完成后要初始化(不想让指向任何内容,=0,=NULL) int a[10]; int *p =  ...

  7. c语言数组的使用步骤,C语言中为什么要使用数组?详细图解数组的使用

    唉,有这么多不同主题的书.在哪里才能找到有关中国音乐的书呢? 数组是可以在内存中连续存储多个元素的结构 数组中的所有元素必须属于相同的数据类型 1.在计算机内存中,同一数组的所有元素按下标顺序依次存放 ...

  8. c不能做oracle关键字,C语言中的关键字不能作变量名,但可以作为函数名。

    语言中目的工助学中心的立勤成是(. 个运在整程中输过,键字它们是(,个单重要的据是有三非常. 作变作包括运输费率.自动下级部门继承,目选择不能不同的科,目部门的折旧科设置上级.故用固定管理资产系统不 ...

  9. C语言中自定义函数返回数组类型

    相信大家在C语言中写一些函数的返回值用到了void,int,char,double等等,但是好像没有遇到数组类型的,确实在C语言直接返回数组类型,是会报错的.具体的原因只要大家学习了指针还是可以理解的 ...

  10. C语言中常用的字符数组函数

    所有的字符数组处理函数都包括在 <string.h>这个头文件中 一.strlen 函数 原型:size_t strlen(char const* string); 在C语言中如何计算一个 ...

最新文章

  1. Atitit.注册跟个登录功能的实现attilax总结obo
  2. 【机器学习】xgboost系列丨xgboost原理及公式推导
  3. 2014年工作中遇到的20个问题:120-140
  4. Gitee ssh 公钥配置好后,仍然 permission denied 的排查过程及解决方法
  5. Elasticsearch过滤与聚合的先后顺序java实现
  6. Eclipse中显示文件字符乱码
  7. php where 不包含,php – 除非它们包含“where”或“like”子句,否则不允许删除
  8. Android之Bundle类
  9. Java笔记-使用logback按天生成日志并按等级进行分类
  10. 在3D场景中显示汉字
  11. 张宇1000题高等数学 第十、十一、十二章 一元函数积分学的应用——几何应用、积分等式与积分不等式、物理应用
  12. socket can 编程
  13. Java包装类相关知识点
  14. php微信摇一摇,怎样使用JS+H5实现微信摇一摇
  15. Centos7 -- 用三种方法设置代理服务器上网
  16. this的三种常见用法
  17. 力扣739:每日温度【C++】
  18. systemtap工具使用介绍
  19. 八皇后问题(dfs)
  20. [基于harbor部署私有仓库] 4 推送镜像到harbor

热门文章

  1. Ubuntu 18.04 + Anaconda 5.2 + Pycharm
  2. 使用script命令自动录屏用户操作
  3. bnuoj 20950 沉重的货物 (最小生成树)
  4. javascript——原型与原型链
  5. 2-2 工程源码文件结构
  6. 局内网用户访问wamp本地站点
  7. Linux文件系统简介及常用命令
  8. easyui from 缓存问题处理
  9. 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)
  10. Golang库学习笔记 Gin(三)