数组与指针
首先说一下声明(declaration)和定义(definition)。声明只是告诉编译器存在一个变量,可能会用到;定义是创建一个变量,为变量分配内存空间。声明可以有多个,而定义只能有一个。
1.概念
数组用来存放多个相同类型的变量,数组的类型就是它存放元素的类型,如 int arr[10] 表示数组arr存放了10个int型变量;
指针是一种特殊的变量,它存放地址,它的类型代表了该指针存放哪种类型变量的地址,如 int *p 表示指针p存放一个int型变量的地址。
2.数组与指针的异同
1)当数组名作为函数形参时,数组和指针等价,此时编译器将数组名转化成指向数组第一个元素的指针。此时sizeof()无法得到数组的长度。当需要数组做函数的形参时,函数的声明可以是一下三种:
void func(char *p);
void func(char a[]);
void func(char a[10]);
至于为何要将数组名转化为指针,主要是出于效率的考虑。若对形参采用传值引用,则要复制整个数组的内容,降低了效率。
2)在表达式中数组名就是指针
a[2]=1;首先取得数组首地址,即a,然后向下偏移两个位置,等价于*(a+2)。
3)数组名和指针都可以做左值,数组名是不可改变的左值,而指针是可以改变的左值。