char a[10] = "abcd";
char c = a[i];
由于a是一个数组,因此在符号表中,a代表了一个地址,指向了数组的第一个元素。
此时,编译器这样去获取a[i].
1. 获取i的值,与符号表中的a的值相加,得到地址addr
2. 获取addr处的值。
char arr[10] = "abcd";
char *a = arr;
char c = a[i];
此时a是一个指针,它指向了一个数组,它的内存空间保存了一个数组的首地址。
此时,编译器这样去获取a[i].
1. 获取a处的值,作为数组的起始地址baseAddr;
2. 获取i的值,并与baseAddr相加得到addr
3. 得到addr处的值。
因此,如果有一个文件定义了一个数组char arr[N]; 另一个文件却使用指针声明,extern char *arr;
如果这样调用arr[i],这样将会产生问题。