1,初始化指针时所创建的字符串常量是不可以修改的;而字符串常量初始化的数组是可以修改的。
2,所有作为函数参数的数组名总是可以通过编译器转换为指针;如下
fun(int arr[]){
arr[1]=2;
*arr=3;
arr=array;
}
在此函数中,数组名arr作为参数,可以被解释为指针,并且可arr以被重新赋值;但在其它情况中,arr是固定的值,也就是数组首元素的地址,它是个固定的值,不能被修改的。
一段代码如下:
#include<stdio.h>
void main(){
char ca[14]={"I love China"};
void show1(char a[]);
void show2(char*pa);
printf("%x %x %x\n",&ca,&(ca[0]),&(ca[1]));
show1(ca);
show2(ca);
}
void show1(char a[]){
printf("%x %x %x\n",&a,&(a[0]),&(a[1]));
}
void show2(char*pa){
printf("%x %x %x %x\n",&pa,&(pa[0]),&(pa[1]),pa);
}
运行结果如下:
注意:第二行第一列和第三行第一列的值是相同的,也就是说我们用数组名作为实参,调用数组名作为形参的函数和指针作为形参的函数时的结果是一样的;数组名作为函数形参时,被解释为指针。
3,表达式中的数组名就是指针;如下
int a[20],*p,i=2;
(1) p=a; (2) p=a; (3)p=a+i;
p[i]; *(p+i); *p;
以上三种方式都可以访问a[i]。
4,在声明时,数组的声明就是数组,指针的声明就是指针,不能混淆。不能将p声明为指针,却定义为数组。要使得声明和定义相匹配。
5,C语言把数组下标作为指针的偏移量。根本原因:指针和偏移量是底层硬件所使用的基本模型。