首页 > 代码库 > extern int *a与extern int a[]

extern int *a与extern int a[]

<body>

extern int *a与int a[]

Table of Contents

  • 1. 问题:
  • 2. 解答:

1 问题:

下面的声明取自某个源文件:

int a[10];
int *b=a;

但在另一个不同的源文件中,却发现了这样的代码:

extern int *a;
extern int b[];
int x,y;
x=a[3];
y=b[3];

请解释,当两条赋值语句执行时会发生什么?

2 解答:

  1. 指针是变量,系统会为每个变量开辟存储空间,包括指针变量
  2. 数组名神似指针,一些情况下可视为指向数组第一个元素的指针(所以定义的数组声明时被声明为指针也是可以的,只不过声明文件中代表指针用了),但是实际上数组名是"实实在在"的"地址",表示的是存储数组元素的空间的起始位置,系统不会为数组名本身开辟存储空间(&数组名得到的地址还是数组名)
  3. 对待一个变量i,取出变量的内容步骤可以视为:1).找到变量i的地址(&i) 2).取出&i地址起i类型那么大空间的内容作为变量i的值

在第一个赋值中,编译器认为a是一个指针变量,所以它提取存储在那里的指针值,并加上12(3和整型的长度相乘),然后对这个结果执行间接访问操作。但a实际上是整型数组的起始位置,所以作为"指针"获得的这个值实际上是数组的第一个整形元素。它与12相加,其结果解释为一个地址,然后对它进行间接访问。作为结果,它或者将提取一些任意内存位置的内容,或者由于某种地址错误而导致程序失败。

在第2个赋值中,编译器认为b是个数组名,所以它把12加到b的存储地址,然后间接访问操作从那里获取的值。事实上,b是个指针变量,所以从内存中提取的后面的第三个int实际上是从另外的任意变量中取得的,这个问题说明了指针和数组虽然存在关联,但绝不是相同的。

Author: kirchhoff

Created: 2014-11-10 Mon 22:13

Emacs 24.4.1 (Org mode 8.2.10)

Validate

extern int *a与extern int a[]