8.4 指针与数组
8.4.1 指向数组元素的指针
int a[10]; //a为包含10个整型数据的数组
int* p; //p为指向整型变量的指针变量
p = &a[0]; /*把a[0]元素的地址赋给指针变量p,
即让p指向a数组的第0号元素等价于p=a;*/
/*也可以写作:
int* p = &a[0]; or
int* p = a;*/
*p = 5; //通过p访问a[0],将数值5存入a[0]
8.4.2 指针的算术运算
指针的算术运算有且仅有三种:
指针加上整数、指针减去整数、两个指针相减
(1)指针加上整数
int a[10], * p, * q, i;
p = &a[2]; //p指向了a[2]
q = p + 2; //q指向了a[4]
p += 3; //p指向了a[5]
(2)指针减去整数
int a[10], * p, * q, i;
p = &a[8]; //p指向了a[8]
q = p - 2; //q指向了a[6]
p -= 3; //p指向了a[5]
(3)两个指针相减
int a[10], * p, * q, i, j;
p = &a[5]; //p指向了a[5]
q = &a[1]; //q指向了a[1]
i = p - q; //i=4
j = q - p; //j=-4
注:
如果p的初值为&a[0],则:
(1) p+i和a+i是a[i]的地址,即它们指向a[i]
(2) * (p+i )和 * (a+i)就是a[i]
(3) p[i]与*(p+i)等价
(4)指针可以用关系运算符和判等运算符进行比较:< <= >= >;== !=
比较的结果依赖于指针指向的元素的相对位置,例如
int a[10], * p, * q, i, j;
p = &a[5]; //p指向了a[5]
q = &a[1]; //q指向了a[1]
p <= q; //值为0
p > q; //值为1
(5)指针的算术运算只有当指针指向数据元素时,才有意义,对未指向数组元素的指针执行算术运算、或者对两个并非指向同一数组的指针做减法、做比较,都将导致未定义行为!
8.4.3 通过指针访问数组元素
访问数组元素通常有两种方法:
(1)下标法:a[2];
(2)指针法:
*(a+2)或*(p+2)
例如,输出数组中的全部元素。其中整型数组a有10个元素,输出各元素的方法有三种:
(1)下标法
#include<stdio.h>
int main()
{
int a[10], i;
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
for (i = 0; i < 10; i++)
printf("%d\n", a[i]);
return 0;
}
(2)通过数组名计算数组元素地址
#include<stdio.h>
int main()
{
int a[10], i;
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
for (i = 0; i < 10; i++)
printf("%d ", *(a+i));
return 0;
}
上述代码第8行也可以改为
printf("%d ", *(p+i));
(3)用指针变量指向数组元素
#include <stdio.h>
int main()
{
int a[10], i, * p;
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
for (p = a;