(3)数组是指针,也不是指针 为什么说数组是指针呢,首先,先声明一个数组int a[10],我们可以通过一个指针,指向数组的首地址int* p =&a[0];之后,我们既可以通过a[5]这样的方式访问数组元素,也可以通过*(p+5)的方式访问,其实你会发现,int* p =&a[0];根本多余,我们可以直接这样int* p = a用数组名;就像是指针给指针赋值,然后他们指向了同一个地方(数组的首地址)。其实c语言在计算a[i]的值时,会对a[i]转化为*(a+i);所以你访问第五个元素时,即可以用a[4];也可以用4[a];因为转化之后*(a+4)和*(4+a)的效果是一样的。所以我说数组就是指针, 但是又不是指针,为什么呢?因为指针是一个变量(我不是说了吗?指针变量)所以赋值 p = q;自增p++都是合法的,但数组名不行,它不是变量,你可以理解为常指针。 还要注意当把数组作为函数形参时,它会退化为指针,所以int func(char* s);和int func(char s[]);等价
(4)字符串,常量还是变量 “i am aiqier”这是一个字符串常量,其实呢,它本身可以理解为一个指针,为什么这么说呢,char* p =”i am aiqier”但是这个字符串常量是放在常量区的,是只读的, 而char message[] = “i am aiqier”;这个message是数组,用每一个字符初始化数组元素,就像是这样message[] = {‘i’ , ‘ ‘ , ‘a’ , ‘m’ , ‘ ‘ , ‘a’ , ‘i’ , ‘q’ , ‘i’ , ‘e’ , ‘r’ , ‘\0′ };所以它是可读可写的,我们称之为字符串变量。 对于”i am aiqier”,你可以”i am aiqier”[4];使用它,比如打印,但是当你企图赋值时”i am aiqier”[4] = ‘c’;编译链接没问题,运行时就会有错误,比如在windows下会提示你该内存不能read. 作者 aiqier