目录:
1. 开篇
2. 论数组名array、&array的区别
3. array、&array的区别表现在什么地方
4. 讨论
5. 参考
1.开篇
很多博客和贴吧都有讨论这个话题,各有自己的表述方式,今天在他们的基础上我将继续试着以我自己理解的方式总结一下,欢迎大家的审阅和指评。

2.论数组名array、&array的区别——省政府和市政府的区别
例如:
int array[5] = {0};
总所周知,其中的&array是整个数组array的首地址,array是数组首元素的首地址(和&array[0]一样),其值相同,但是“意义不同”

3.那么,到底“意义不同”表现在什么地方呢?
首先,试问下面几行代码分别代表的什么意思呢?这样操作有何意义呢?

array;
array + 1;
&array;
&array[0] + 1;
&array + 1;

下面一步一步的来讨论这个不同表现在什么地方。

/**********************************************************************
* File: array_name.c
* Copyright (C) jingzi123456789, All Rights Reserved!
* Description:
* The difference between the array name and address of the array name
* Version: 1.0
* Date created: 16:48,26/03/2017
* Author: jingzi123456789
*
* ----------------------- Revision History: ----------------------------
* <author> <data> <desc>
*
***********************************************************************/
#include <stdio.h>

#ifndef _STDIO_H
#define _size_ (5)
#endif

int 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是数组首元素的首地址(和&array[0]一样),&array是整个数组array的首地址。在第2节中,已经说明了二者的值相同,但是“意义不同”。这就好比,陕西的省政府在西安,而西安市的市政府也在西安,两个政府都在西安,但其代表的意义完全不同。

那么,对二者地址分别+1,会产生什么效果呢?“+1”指的是一般加法(2+1==3)那样加一吗?假设数组array的首元素的首地址为0x0011FF00,这里“array + 1”的结果会不会是0x0011FF01呢,“&array + 1”的结果会是0x0011FF01?如果不是的话,那会是一个什么值,并且为什么会出现这种结果呢?

然后,在回答以上的问题,先通过编译器VC++6.0在32位系统上编译执行,根据打印输出的结果再做讨论。注意:对于sizeof(int),32位系统下为4字节。

4.讨论:
(1)可以发现array和&array的值是一样的,都是0012FF34。对array+1,结果不是简单的加法那样,即并不是0012FF35,而是0012FF38;由于array[0]和array一样,都是数组首元素的首地址,+1后的结果相同。然而,&array+1的结果却是0012FF48。另外,分别对array和&array求字节长度发现是一样的(结果20是一个十进制数)。

(2)这里会涉及到一下几点知识:

  • 一般情况下声明一个数组之后,比如int array[5],数组名array就是数组首元素的首地址,而且是一个地址常量。但是,在函数声明的形参列表中除外。
  • 在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。——《C和指针》
  • 在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的长度,而不是指向数组的指针的长度。 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针。所以&a后返回的指针便是指向数组的指针,跟a(一个指向a[0]的指针)在指针的类型上是有区别的。——《C和指针》
  • “+1”就是偏移量问题:一个类型为T的指针的移动,是以sizeof(T)为移动单位。
    即array+1:在数组首元素的首地址的基础上,偏移一个sizeof(array[0])单位。此处的类型T就是数组中的一个int型的首元素。由于程序是以16进制表示地址结果,array+1的结果为:0012FF34+1*sizeof(array[0])=0012FF34+1*sizeof(int)=0012FF38。
    即&array+1:在数组的首地址的基础上,偏移一个sizeof(array)单位。此处的类型T就是数组中的一个含有5个int型元素的数组。由于程序是以16进制表示地址结果,&array+1的结果为:0012FF34+1*sizeof(array)=0012FF34+1*sizeof(int)*5=0012FF48。注意1*sizeof(int)*5(等于00000014)要转换成16进制后才能进行相加。

5.参考

http://www.cnblogs.com/xiaolongxia/articles/2752731.html
http://blog.chinaunix.net/uid-12779255-id-2916004.html
---------------------
转自:https://blog.csdn.net/jingzi123456789/article/details/66478310

C语言——数组名、取数组首地址的区别(一)的更多相关文章

  1. C语言 数组名不是首地址指针

    今天上计算机系统课的时候老师讲到了C中的聚合类型的数据结构.在解释数组名的时候说"数组名是一个指针,指向该数组的第一个元素",附上ppt(第二行): 我觉得这是不正确的,是一个常见 ...

  2. C语言的数组名和对数组名取地址

    http://blog.csdn.net/zdcsky123/article/details/6517811 相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针, ...

  3. 搬运1:关于对C语言中数组名取地址加减等操作的一点探究

    对于数组名取地址强制转换的操作 偶然在晚上学了C语言指针后网页闲逛找题时,被一个数组名取地址搞糊涂了,在自己试验加探索后我稍微悟了一点东西. 代码如下: #include<stdio.h> ...

  4. C语言中对数组名取地址

    在C/C++中,数组名相当于一个指针,指向数组的首地址.这里“相当于”不代表等于,数组名和指针还是有很多区别的,这个在<C陷阱与缺陷>里有详尽的讲述.而这里要说的是对于数组名取地址的这么一 ...

  5. C语言学习笔记 (004) - 数组名和数组首地址(转)

    一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中) ...

  6. C语言 对数组名取地址

    作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 演示样例: int a[5] = {1,2,3,4,5}; int *p = (int * ...

  7. 对数组名取地址 a[ ],&a

    C语言规定,数组名代表数组的首地址,也就是第0号元素的地址.所以a==&a[0] 但对数组名取地址时却要注意了,在理解“对数组名取地址”这一表达式的含义时一定要记住:数组名是“数组”这种变量的 ...

  8. 数组名取地址所算数运算应注意的&quot;trap&quot;

    数组名取地址所算数运算应注意的"trap" 直接看代码: #include <stdio.h> int main() { int array[5]; printf(&q ...

  9. 数组名和数组名取地址&

        在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址. 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“ ...

随机推荐

  1. 解决VS Code开发Python3语言自动补全功能不带括号的问题

    Visual Studio Code(以下简称VS Code)用来开发Python3,还是很便利的,本身这个IDE就是轻量级的,才几十兆大小,通过安装插件的方式支持各种语言的开发.界面也美美哒,可以在 ...

  2. 2017.07.07【NOIP提高组】模拟赛B组

    Summary 因为某种无法抗拒的原因,今天没有打比赛,所以也就没有那种心态.今天的题目有状压DP和二分,这套题不难也不简单,适中,适合我这种渣渣来做.在改题时,发现了许多问题.我连欧拉函数的计算都记 ...

  3. Python高级有关的题目

    1,copy模块 from copy import deepcopy dic = {} list = [] for i in range(10): dic["num"] = i i ...

  4. diff比较两个文件 linux

    功能:比较两个文件的差异,并把不同地方的信息显示出来.默认diff格式的信息. diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件.也使用patch命令对 ...

  5. CSS_盒子模型

    2016-10-22 <css入门经典>第6章 1.每个HTML元素对应于一个显示盒子,但不是所有的元素都显示在屏幕上. 2.HTML元素显示为CSS显示盒子的真正方法称为“可视格式化方式 ...

  6. Java中Double类型的精确计算

    import java.math.BigDecimal; public class DoubleUtil { private static final int DEF_DIV_SCALE = 5; / ...

  7. 如何在MyBatis中优雅的使用枚举

    问题 在编码过程中,经常会遇到用某个数值来表示某种状态.类型或者阶段的情况,比如有这样一个枚举:   public enum ComputerState { OPEN(10), //开启 CLOSE( ...

  8. windows10创建ftp服务器

    1.创建用户 2.创建FTP服务 3.开通防火墙服务 建立端口21,20入站规则 4.访问测试

  9. http重定向到https

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.we ...

  10. 小程序入门学习Demo

    技术:小程序   概述 适合学习小程序的初级开发人员,入门教程 详细 代码下载:http://www.demodashi.com/demo/14956.html 小程序周边美甲美发预约Demo 代码主 ...