函数参数表中的数组实际上是指针
- 子函数内的数组和main函数的数组完全一样
- 可以用函数内的数组进行运算,赋值,修改
因此以下四种函数原型是等价的:
- int sum(int *ar, int n);
- int sum(int *, int);
- int sum(int ar[], int n);
- int sum(int [], int);
结论:数组变量是特殊的指针(常量指针)
-
数组变量本身表达地址,所以
int a[10];int *p=a; \\无需用&取地址 -
但是单个数组的单元表达的是变量,需要用&取地址
如:a==&a[0]; -
[]运算符可以对数组做,也可以对指针做
p[0]等价a[0] -
*运算符可以对指针做,也可以对数组做
*a=25;
a[0]=25;
数组和指针的区别
- 【存储】字符数组每个元素存储一个字符,字符指针存储的是地址。
- 【赋值】数组不能被赋值,被作为参数传入到另一个函数里时,数组变量被看作const的指针(常量指针),int b[] 相当于 int * const b;只能在初始化时赋值。而指针可以被赋值,int *q = a;
数组变量本身不能被赋值
int a[]={2,4,6,7,1,3,5,9,11,13,23,14,32};
int b[]=a;//这是错误的。
——要把一个数组的所有元素交给另一个数组,必须采用遍历。
for(i=;i<length;i++){
b[i]=a[i];
} - 【定义】数组初始化时必须写明大小,比如:char s[10];gets(s); 字符指针必须初始化才能使用。
- 【运算】数组不许改变,指针允许改变(如++、–、赋值等)
技巧
通用公式:指针p指向数组a[],*(p+i)和 *(a+i)等效于a[i]