1 用指针访问数组的三种方式
#include <stdio.h>
int main()
{
int array[5] = {5, 10, 15, 20, 25};
int i;
int * ptr_array = array;
for(i = 0; i < 5; i++)
{
printf("第%d个元素的值为%d\t地址为%p\n", i + 1, ptr_array[i], &ptr_array[i]);
printf("第%d个元素的值为%d\t地址为%p\n", i + 1, *(ptr_array + i), ptr_array + i);
printf("第%d个元素的值为%d\t地址为%p\n", i + 1, *ptr_array, ptr_array);
ptr_array++; //每次循环都会移动指针,要注意重置指针的位置
}
return 0;
}
- 递增运算符 ++ 比指针 * 和的优先级高,如 *ptr_array ++
- array 是数组名,也是数组的首地址
- 数组名不能进行加减操作
- array 的值和 &array[0] 的值相同
- 指针变量可以指向数组元素
int * ptr_array = &array[4]; // array[4]相当于*(ptr_array + 4)
int * ptr_array = array + 4;
- 若指针
P1
和P2
指向同一数组(只有这样相减才有意义),执行P2-P1
,结果是P2-P1
两个地址距离,即地址数值差除以数组元素长度。 - 指针可以
++
,--
,或者加上一个数,减去一个数,两个指针相加无意义,相减只有在上一条情况下才有意义。
2 一维数组做函数的参数
2.1 方法一
int func(int arr[], int n);
int func(int [], int); // 在声明时可以省略形参名
2.2 方法二
这种指针形式仍然可以在函数内用arr[n]
的形式表示数组元素。
int func(int *arr, int n);
int func(int *, int); // 在声明时可以省略形参名
3 指针自增自减运算
若指针p
指向数组a
*p++
=*(p++)
,先引用,再自增*(++p)
,先自增,再引用++(*p)
=++a[0]
,数组元素加1
若指针p
指向数组a
中第i个元素*(++p)
=a[++i]
*(p++)
=a[i++]
*(--p)
=a[--i]
*(p--)
=a[i--]