例子1:
char a[10] = “hello”; //数组a的定义+初始化。数组的定义在栈上开辟一个10个byte的空间,空间里用“hello”来填充。 char *p = a; //定义 char 指针p指向a在栈里的地址。
例子2:
char a[10]; //定义char 数组,在栈上开辟10个byte的空间。 a = "hello";//在表达式中数组当做指针来处理,但因该是当做常量指针,既指针的指向不能发生变化。
//所以在此处意思是在常量区开辟一个空间填充为“hello”,然后将a的地址指向该常量空间的地址,常量指针的指向是不能改变的,所以错误。
*a = 'f'; //这样是可以的,因为在表达式中,数组是当做指向数组首地址的指针来处理的,所以此处可以通过编译。
例子3:
char a[10]; char *p = "hello"; memcpy(&a, p, strlen(p)); //用memcpy来对已经声明的数组赋值。
例子4:
file1: extern char *p; //声明 file2: char p[10] //定义
指针是间接寻址,数组是直接寻址,既指针只是一个存储有指向要访问对象的地址的地址,而数组是直接存储的数组的地址。
既char p[10]会在符号表里面记录p的地址比如说是0x8000,则访问该数组的第i个元素时,访问的是0x800i地址存储的内容,
char *p 会记录指针p的地址,比如说是0x4000,0x4000存储的是地址0x8000,则访问第i个元素时可以用p=+i;,然后p指向0x800i。
例子5:
int arr1[10]; int arr2[10]; fun1(int arr []) //在函数传递中,数组默认当做指向数组首地址的变量指针来传递,所以这个指针的指向可以改变。 { arr[1] = 3; *arr = 2; arr = arr1; } fun2(int *arr) { arr[1] = 3; *arr = 2; arr = arr2; } int main () { arr1 = arr2; //编译不通过,因为在表达式中数组是当做常量指针,所以不能改变指向。 }