△两个问题
问题1:
分析:
#include <stdio.h> void main() { char a[]="happylife"; char * p = a; printf(" a ----- %x \n",&a); printf(" p ----- %x \n",&p); }
输出的结果会相同吗?
运行结果:
都是指向了数组首地址,结果为什么不一样呢?
这个问题足以说明数组和指针并不相同。
问题2:
假如文件1中定义了一个数组a:
/******文件1****/
int a[5]={0};
/***************/
在文件2中想调用数组a,这个时候我们必须声明a
/******文件2****/
extern int * a;
/***************/
这时候我们发现程序无法运行,但我们把声明改为extern
int a[];就可以正常运行了,为什么呢?
究其为什么不同?
用问题1中程序解释
当我们取a[4]与p[4]时都能得到‘y’字符,但编译器提取字符的方式不同
当我们定义数组a时,a的地址12ff3c的即为数组第一个元素的地址,当运行a[4]时,编译器知道a是一个数组名,就取(12ff3c+4)的内容;
当我们定义指针变量p时,编译器开辟一个空间存变量p,空间首地址为12ff38,当运行p[4]时,先取其保存的内容12ff3c,然后取(12ff3c+4)的内容。多了一次提取内容的操作!
如果上面看懂了,这样我们就不难解释问题2的疑惑了,当在文件1中定义了一个数组,在文件2中申明它是一个指针,如果运行a[4],按照上面的方法,它会把字符‘y’当做一个地址,再一次取其内容,这样错的很惨!
什么时候相同?
1.在表达中,a[i]编译器都会解释为*(a+i)形式 (这也是我们容易把指针和数组混淆为相同的原因)
2.作为函数参数时,无论写成指针形式还是数组形式,编译器都会把他当做指向数组第一个元素的指针。
因为在函数内部,始终当成指针访问,不会管到底输入的是数组还是指针。
★重点终结★:
1. 无论什么时候,我们定义成什么,就应该申明什么,不能混用,因为直接影响编译器解释!
2. sizeof()使用:sizeof(a)得到 10
sizeof (p) 得到 4 这也是数组名和指针的不同之处
3. 可以执行p++;
但不能执行a++; 因为a只是个数组名,它不能作为左值被赋值~!