2.9.3 数组与指针
前面我们已经知道,通过数组下标可以确定数组元素在数组中的顺序和存储地址。由于每个数组元素相当于一个变量,因此指针变量可以指向数组中的元素,也就是说可以用指针方式访问数组中的元素。
对一个指向数组元素的指针变量的定义和赋值方法,与指针变量相同。例如:
- int a[10]; /*定义a 为包含10个整型数据的数组*/
- int *p; /*定义p 为指向整型变量的指针*/
- p=&a[0]; /*把a[0]元素的地址赋给指针变量p*/
C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。因此:
- p=a; /*等价于p=&a[0]; */
- int *p=a; /*等价于int *p=&a[0]; */
对于指向首地址的指针p,p+i(或a+i)就是数组元素a[i]的地址,*(p+i)(或*(a+i))就是a[i]的值。如果指针变量p 已指向数组中的某一个元素,则p+1 指向同一数组中的下一个元素。
引入指针变量后,就可以用以下两种方法来访问数组元素:
(1)下标法,即用a[i]形式访问数组元素,在前面介绍数组时都是采用这种方法。
(2)指针法,即采用*(a+i)或*(p+i)形式,用间接访问的方法来访问数组元素,其中a 是数组名,p是指向数组的指针变量,其初值p=a。具体实现过程如程序2.24中的代码。
【程序 2.24】定义一个数组,并用指针法访问数组的元素:test24.c。
- #include <stdio.h>
- main()
- {
- int i;
- int a[5]={0,1,2,3,4}; /*声明一个数组并对其进行初始化*/
- int *p=a; /*把数组的首地址赋给指针变量p*/
- for(i=0; i<5; i++)
- printf("a[%d]=%d\n",i,*(a+i)); /*通过数组名计算元素的地址,找出元素的值*/
- for(i=0; i<5; i++)
- printf("a[%d]=%d\n",i,*(p+i)); /*用指针变量指向元素*/
- }
程序运行结果如下:
- a[0]=0
- a[1]=1
- a[2]=2
- a[3]=3
- a[4]=4
- a[0]=0
- a[1]=1
- a[2]=2
- a[3]=3
- a[4]=4