C语言——数组名、取数组首地址的区别(一)即&array 与array区别

mac2024-11-08  9

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

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

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

array;    array + 1; &array;   &array[0] + 1;    &array + 1; 1 2 3 4 5 下面一步一步的来讨论这个不同表现在什么地方。

/********************************************************************** * 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; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 首先,试着分析一下这段程序。我们知道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 ———————————————— 版权声明:本文转载自博主「Joohong」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/jingzi123456789/article/details/66478310

最新回复(0)