C语言的指针与数组
2009-12-02 17:46:38| 分类:
R&D
| 标签:
|举报
|字号大中小 订阅
1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址),它的步进是其所指对象的大小;
2、数组的本质则是一系列的元素(元素也可以是数组)。数组名对应着(而不是指向)一块内存,所以数组名不占用存储空间,其地址与容量在生命期内保持不变,当然数组的内容可以改变。索引比较方便。
3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
对于int array[n], &array表示是指向数组的指针
int array[m][n] 可以看作int (array[m])[n] , &array[0]表示是指向数组的指针(int (*)[n]类型的)
指针和数组存在着一些本质的区别。
1)两者的内存布局不同
数组需要在内存中占用若干字节的空间,这段内存区通过数组名来标志。指针则需要额外的4个字节的空间(32bit系统)来存放地址,这4个字节用名字指针变量名来标志。其中存放的地址几乎可以指向任何地方。
2)取下标的执行代码不同
对于a[2]和p[2]编译器产生的执行代码却不一样。对于a[2],执行代码是从a的位置开始,向后移动2两个字节,然后取出其中的字符。对于p[2],执行代码是从p的位置取出一个地址,在其上加2,然后取出对应内存中的字符。
指针数组&数组指针&指向指针的指针
以二维数组来说明三者各自的适用场合。
静态数组:各维确定,适用于整体空间需求不大的场合,此结构可方便索引,eg.a[m][n]。
数组指针:低维确定,高维需要动态生成的场合,eg.a[*][n]。
指针数组:高维确定,低维需要动态生成的场合,eg.a[m][*]。
指向指针的指针:高、低维均需要动态生成的场合,eg.a[*][*]。
指向指针的指针的例子(兼有数组访问的灵活性)
在做一个文本处理程序的时候,有这样一个问题:什么样的数据结构适合于按行存储文本?
一行文本的字符个数或多或少不确定,整个文本所拥有的文本行数也是不确定的。这样的特征决定了使用指向指针的指针有很大的优越性。
就横向而言,因为指针的灵活性,它可以指向随意大小的字符数组。
就竖向而言,可以动态生成及扩展需要的指针数组的大小。
评论这张
转发至微博
转发至微博
评论