数组和指针并不同

来源:互联网 发布:国际卫生统计网络直报 编辑:程序博客网 时间:2024/05/02 01:23

问题:

文件1:

int mango[100]; 

文件2:

extern int  *mango;

 ...........

这里,文件1定义了数组mango,但文件2声明它为指针。这有什么错误吗?

 

在回答这个问题之前我们来看一下

图1 对数组进行下标引用


图2 对指针进行下标引用


在一个文件

对照图1的访问方式:

char *a=”abcdefgh”; ......a[3]

对照图2的访问方式:

char *p=”abcdefgh”;.......p[3]

在这两种情况下,都可以取得字符‘d’,但两者途径是不同的。

 

如果在另外文件声明  external char *p,然后用p[3]来引用其中的元素,不管p原先定义是指针还是数组,都会按照如下步骤进行操作:

1.      取得符号表中的p的地址,提取存储于此处的指针

2.      把下标所表示的偏移量和指针值相加,产生一个地址。

3.      访问上面这个地址,取得字符

但是只有当p原来定义为指针时这个方法才是正确的。考虑一下p在这里被声明为external char* p;而它原来的定义是char[10];这种情形。当用p[i]这种形式提取这个声明的内容时,实际上得到的是一个字符。但按照上面的方法,编译器却把它当成了一个指针,把字符解释为地址显然是不对的,所以程序出错。

 

问题解决:

使声明与定义匹配

文件1:

int mango[100];

文件2:

extern int mango[ ];

……..

 数组与指针其他区别:

指针

数组

保存数据的地址

保存数据

间接访问数据,首先取得指针的内容,把它作为地址,然后从这个地址提取数据。

如果指针有一个下标[ I],就把指针的内容加上I作为地址,从中提取数据

直接访问数据,a[I]只是简单地以a+I 为地址取得数据

通常用于动态数据结构

通常用于存储固定数目且数据类型相同的元素

相关的函数malloc(),free()

隐式分配和删除

通常指向匿名数据

自身即为数组名

 

那什么时候数组与指针相同呢?

1.“表达式中的数组名”就是指针(在编译器里最终形式都是指针)

2.C语言把数组下标作为指针的偏移量(指针和偏移量是底层硬件所使用的基本模型)

3.“作为函数参数的数组名”等同于指针(出于效率的考虑)

 

参考《C专家编程》




0 0