1. 首先要明白数组和指针是怎么访问的
1. 数组访问形式
char a[] = "abcdefg";
c = a[i]; //i=0~6
编译器符号表示一个地址 假设 a 值 9980
运行时 取i的值
取地址(9980+i)的内容
2. 指针访问形式
char *p;
char c = *p;
假设p的地址为 4624
运行时 取 4624 内容 也是一个地址 5081
取地址5081的内容
char *p = "abcdefg";
c = p[i];
取4624中内容 5081
取i的值
取地址(5081+i)的内容
2.
file1
char p[10] = "abcdefg"; //p的值9980
file2
extern *p;
则在file2中会将p当成指针看待进行三步操作
首先 取9980的内容结果是'a', 然后把'a'当成地址取值,这里就出现问题了。这就是为什么不能将char *p 声明成 extern char *p;
那 为什么下面这个又是正确的呢?
void f( char *p )
{
printf( “%d\n”, p[2] );
}
int main()
{
int v[] = {1, 2, 3}; //v的值 9980
f( v );
return 0;
}
因为函数参数传递是按值传递,那么p里面的值就是9980.
所以就很容易了
另外:我看网上有人说这样编译不会出问题, 但是我在VC6.0 的环境下 编译时 会报错。有知情人麻烦告知。谢谢。