数组名代表数组的首地址,例如:
int a[10];
int *p=NULL;
p=a;
其中,数组名a
代表数组的首地址(即&a[0]
),那么表达式a+i
代表数组中下标为i
元素a[i]
的地址,即&a[i]
。
还可以通过使用间接寻址*
来引用数组元素。例如:*(a+i)
表示取出首地址元素后边第i
个元素的内容,即下标为i
的元素a[i]
。
此外,还可以通过一维数组的指针变量p
来引用数组a
中的元素,*(p+i)
就表示取出p+i
所指的内存单元内容,即元素a[i]
的值。*(p+i)
也可以用它的下表形式p[i]
来表示。
例如:
# include <stdio.h>
int main(void)
{
int a[] = {1, 2, 3, 4, 5};
int *p, *q, *r;
p = &a[3]; //第一种写法
printf("*p = %d\n", *p);
q = a; //第二种写法
q = q + 3;
printf("*q = %d\n", *q);
r = a; //第三种写法
printf("*(r+3) = %d\n", *(r+3));
return 0;
}
输出结果是:
*p = 4
*q = 4
*(r+3) = 4
注意:(1)与通过*(a+i)
来引用数组元素a[i]
不同的是由于指针变量p
不一定永远都指向数组元素的首地址&a[0]
,因此仅当指针变量p
指向数组元素首地址&a[0]
时,*(p+i)
才是对a[i]
的引用,否则,如果通过增1运算改变指针变量p
的指向,使p
指向a[i]
,那么*)
就是对a[i]
的引用。
(2)数组名a
是一个地址常量,不能通过赋值操作改变它的值。指针变量p
是一个变量,可以通过赋值运算改变它的值,从而使p
指向数组中的其他元素。
(3)虽然p+1
和p++
都指向当前指针所指向单元的下一个元素但是p+1
不改变当前指针的指向,而p++
相当于执行p=p+1
,因此p++
操作改变了指针p
的指向,表示指针变量p
向前移动使其指向下一个元素。
(4)p+1
增加1*sizeof(指针的基类型)
。
例如:
# include <stdio.h>
int main(void)
{
int a[] = {1, 2, 3, 4, 5};
int *p = a;
printf("p = %d, p + 1 = %d\n", p, p+1);
return 0;
}
输出结果是:
p = 1638196, p + 1 = 1638200
参考文献:C语言大学实用教程