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 解答:
- 指针是变量,系统会为每个变量开辟存储空间,包括指针变量
- 数组名神似指针,一些情况下可视为指向数组第一个元素的指针(所以定义的数组声明时被声明为指针也是可以的,只不过声明文件中代表指针用了),但是实际上数组名是"实实在在"的"地址",表示的是存储数组元素的空间的起始位置,系统不会为数组名本身开辟存储空间(&数组名得到的地址还是数组名)
- 对待一个变量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)
时间: 2024-10-07 16:15:50