今天在梳理指针地址的问题中,突然发现数组首地址都能用arry和&arry来表示。所以网上查找了一下这两个区别,总结如下。

1. 区别

int arry[5] = {0};

arry      数组首元素的地址 (等同&arry[0])

&arry   整个数组的首地址

2. 相同点

arry 和 &arry 打印出的值都是相同的

3. 代码

#include <stdio.h>#ifndef _STDIO_H
#define _size_  (5)
#endifint main()
{int array[_size_] = {0};printf("        array = %p\n", array); printf("       &array = %p\n", &array); printf("    array + 1 = %p\n", array + 1);printf("&array[0] + 1 = %p\n",&array[0] + 1);printf("   &array + 1 = %p\n", &array + 1);printf("\n");printf(" sizeof(array) = %d\n",sizeof(array)); printf("sizeof(&array) = %d\n",sizeof(&array));printf("\n");   return 0;
}

运行结果:

        array = 0xffffcbe0&array = 0xffffcbe0array + 1 = 0xffffcbe4
&array[0] + 1 = 0xffffcbe4&array + 1 = 0xffffcbf4sizeof(array) = 20
sizeof(&array) = 8

分析:

首先array和&array就不分析了。

因为array 等效于&array[0],所以3,4行运行结果一样,+1是偏移一个成员类型大小(为什么是成员类型大小?是根据array或&array的类型来的,因为他们都是代表首地址的地址,首地址存储的是第一个成员,所以偏移成员类型的大小)。

同理,&aaray是整个数组首地址,所以偏移要偏移整个数组的大小,整个数组大小为5*4=20,所以偏移20。

4. 补充

  • 在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。——《C和指针》
  • 在以上代码19,20行,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。——《C和指针》

注意:以上代码运行环境是 Cygwin 64系统

数组首地址arry和arry的区别相关推荐

  1. 【C 语言】数组与指针操作 ( 数组符号 [] 与 指针 * 符号 的 联系 与 区别 | 数组符号 [] 与 指针 * 符号 使用效果 基本等价 | 数组首地址 与 指针 本质区别 )

    文章目录 前言 一.数组符号 [] 与 指针 * 符号 使用效果 基本等价 二.数组首地址 与 指针 本质区别 前言 参考 [C 语言]指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方 ...

  2. C语言中数组首地址和数组第一个元素的地址有什么区别

    C语言中数组首地址和数组第一个元素的地址关系如下: 1.它们的地址值是相等的. 2.第1个元素的地址如果是p,则p+1就是第2个元素的地址. 3.数组的首地址如果是p,则p+1就跳过这个数组而指向这个 ...

  3. 解析:数组名a、数组名取地址a、数组首地址a[0]、数组指针*p

    数组和指针向来就是傻傻分不清,当他们一起出现的时候就更加懵逼. 1 解析不同变量之间的区别: 数组名a: 数组名可以作为数组第一个元素的指针.我们由数组和指针的关系知道,a代表这个地址数值,它相当于一 ...

  4. c 语言 二维数组地址,C/C++ 关于一维或二维数组首地址表示含义

    C/C++ 关于一维或二维数组首地址表示含义 发布时间:2020-06-26 10:35:21 来源:51CTO 阅读:210 作者:sonissa 这是一个经常会忘却的知识点,最近也一直在吃这方面的 ...

  5. C++ 数组名a、数组名取地址a、数组首地址a[0]、数组指针*p

    数组名a: 数组名可以作为数组第一个元素的指针.由数组和指针的关系知道,a代表这个地址数值,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址.数组中的其他元素可以通过a的位移 ...

  6. char a[]和char *a的比较,数组名,数组首地址,a,a,a[0]

    char a[]和char *a的比较 指针和数组存在着一些本质的区别.当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作为函数参数传递进来的指 ...

  7. c++如何打印一维数组首地址_C语言之二维数组和指针的结合

    最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习.自己纠结的问题是二维数组 int a[3][4]的数组名是 ...

  8. c++如何打印一维数组首地址_4.1 数组的定义

    ★ 视频分享 ★ 数组的概念数组是相同数据类型的元素的集合. ★ 数组的特点 一个数组中的所有元素具有相同的数据类型 数组元素相当于变量,系统为每个数组元素分配等大的存储单元 数组元素在内存中按照下标 ...

  9. c语言指针指向数组首地址,C语言指向数组元素的指针

    指向数组元素的指针和运算法则 所谓指向数组元素的指针,其本质还是变量的指针.因为数组中的每个元素,其实都可以直接看成是一个变量,所以指向数组元素的指针,也就是变量的指针. 指向数组元素的指针不难,但很 ...

最新文章

  1. arm-linux-gcc的安装
  2. 11月27号例会记录
  3. 小学计算机管理员培训,中小学计算机管理员培训心得体会-20210401075623.docx-原创力文档...
  4. POJ 1088-滑雪
  5. (转) lucene+paoding亲密接触
  6. linux 文件可执行_深入理解linux内核——可执行文件执行过程(2)
  7. 微信小程序遇到的那些坑
  8. jQuery练手之滑动出现效果
  9. 与Android热更新方案Amigo的亲密接触
  10. AltiumDesigner16安装教程
  11. 超定方程组和欠定方程组
  12. 旅游新纪元紫山缭绕,静思生活
  13. html一排小标题怎么写,工作总结大标题小标题怎么写
  14. 5、kali安装输入法——搜狗拼音
  15. Python练习--模仿王者荣耀定义两个英雄类
  16. 以计算机思维思考当下面向未来,面向未来的核心素养:从运算能力到计算思维...
  17. iOS bounds备忘
  18. NOSQL之Neo4j:Neo4j的简介、安装、使用方法(Neo4j搭配JDK安装的图文教程)之详细攻略
  19. 基于SSM的音乐视频网站的设计与实现
  20. 编程语言都代表哪些国家?

热门文章

  1. YOLO中MAP的具体计算
  2. WinEdt Latex 在字母上加两个点
  3. 判断点在多边形内的算法(Winding Number详解)
  4. python文本格式上一日_一日一技:在 Python 中快速遍历文件
  5. 安装anaconda时需要卸载python么_怎么卸载python 安装 anaconda
  6. zblog mysql修改_ZBlog教程 之 修改ZBlog数据库前缀
  7. winSCP:无权访问。 错误码:3 服务器返回的错误消息:Permission denied解决方案
  8. 请打开正确的提问方式
  9. com、cn域名到期删除时间
  10. 八股文--->JAVA基础