指针和数组的内存构造

2011年2月1日 由 edsionte 留言 »

指针和数组是不相同的,但“很多时候”我们总认为指针和数组等价的。不可否认,这两者在某种情况下是可以相互替换的,但并不能就因此而认为在所有情况下都适合。《指针和数组不是一回事儿》系列文章将逐步深入分析指针和数组的不同之处,并解释什么时候指数组等价于指针。本文属于《指针和数组不是一回事儿》系列文章之一。

指针和数组的本质是什么,这是本文讨论的重点。从内存结构的角度来说,两者是截然不同的两个概念。

数组的声明与定义

关于C语言中的声明,《声明那回事儿》一文中已详细叙述。这里再具体针对数组的定义和声明做以分析。以下面的声明代码为例:

char str[10];
extern char str[];

第一条声明语句定义了一个char型的数组,并为其分配了100字节大小的内存空间。而第二条声明语句则是为了告诉编译器这个数组的类型以及大小。由于在外部引用型声明中并不会数组分配内存空间,因此这种声明并不需要指定数组的大小。对于多维数组也并不需要指定第一维的大小。

指针的内存布局

指针本质上就是一个内存地址,为了方便使用这个内存地址将它和一个标示符绑定在一起。比如:

int i = 10;
int *p = &i; /* 假设变量i的内存地址为0x000F3E00 */

上述语句将地址0x000F3E00和p绑定在一起,并且一旦绑定就不能再修改,p此时也被称为指针变量,简称指针。“指针变量“中的“变量”并不是说明p可以再和其他地址绑定,而是强调与p绑定的这个地址中的内容可变,即i的值可以变化。

既然指针p是一个内存地址,那么在32位的系统中指针p所占的内存大小就始终为4字节。虽然整型变量i也占4字节,但是这两个同大小的内存空间却有着本质区别。指针p只能存放内存地址,并且这个地址只能是整型数据的首地址。即使在p内存放了其他数据,也会一律被当作内存地址来处理。

通过下图可以近一步了解指针和其所指数据的关系:


从图中可得知,不管指针所指数据占多大的内存空间,指针本身只占用4字节的大小。由于指针p本身占用4字节的内存空间,因此这部分内存空间也必然会有首地址。通过&p操作就可以得到指针p的首地址,也就是存储指针p的内存空间的首地址。从上图中可以看到指针p中即为整型变量i的首地址,因此我们也称p是一个指向整型变量i的指针。

数组的内存布局

数组是一块连续的内存空间,这块内存空间的名称即为数组名。比如:

int a[100];

当定义了一个具体的数组a时,编译器就根据数据类型和大小为其分配100*sizeof(int)大小的内存空间,并将这块连续的内存空间命名为a。虽然我们可以通过a[i]这种方式来访问元素i,但这并不代表a[i]就是这个元素的名称。因此每个数组元素实际上是没有名字的,编译器只为这块内存提供了唯一的名称a。同时数组名a也代表数组首元素的首地址。数组的内存结构如下:


通过对指针和数组内存布局的分析,我们可以得知这两者完全是不相同的。指针不管指向什么数据,它本身的大小就是4个字节(32位系统);而数组则是一块连续的内存空间。在下文中,将会从访问方式的角度分析指针和数组的不同。

参考:

《C专家编程》 人民邮电出版社;(美)林登(LinDen.P.V.D) 著,徐波 译;

《C语言深度解剖》北京航空航天大学出版社;陈正冲 著;

广告位

5 条评论

  1. 唐银国说道:

    C语言的那些事第六题,不是你的说的结论,是指针变量没有初始化,*p有内容,但是p没有内容,这是个野指针,即使没用函数传递,也不能完成赋值,在p有内容的情况下,更改p=&dummp为*p=dummp即可

    [回复一下]

  2. 唐银国说道:

    从你的博客中感觉你学习linux透着陈莉君老师的影子

    [回复一下]

  3. bananapeel说道:

    “简称指针。“指针变量“中的“变量”并不是说明p可以再和其他地址绑定,而是强调与p绑定的这个地址中的内容可变,即i的值可以变化。”
    指针变量在没有加const时,怎么不能被赋上别的变量地址????

    [回复一下]

  4. 唐银国说道:

    你说的对

    [回复一下]

  5. searchop说道:

    上面说的p = &i后,p不能在改变成其他的地址,是不是有错误,p还可以在绑定其他的变量,并不是不可以改变的。
    所以说p所指向的内容和p本身都是可以改的吧,

    [回复一下]

发表评论

windows 7 ultimate product key

windows 7 ultimate product key

winrar download free

winrar download free

winzip registration code

winzip registration code

winzip free download

winzip free download

winzip activation code

winzip activation code

windows 7 key generator

windows 7 key generator

winzip freeware

winzip freeware

winzip free download full version

winzip free download full version

free winrar download

free winrar download

free winrar

free winrar

windows 7 crack

windows 7 crack

windows xp product key

windows xp product key

windows 7 activation crack

windows7 activation crack

free winzip

free winzip

winrar free download

winrar free download

winrar free

winrar free

download winrar free

download winrar free

windows 7 product key

windows 7 product key