- 指针与一维数组
- 数组的指针
数组是有一定顺序关系的若干变量的集合,占用连续的存储空间,集合中的每个元素就称之为数组的元素。
数组元素的地址是指数组元素在内存中的起始地址。可以由各个元素加上取地址符“&”构成。比如:&a[0]就表示数组中第一个元素的地址,&a[1]就表示第二个元素的地址,以此类推。
特别要强调的是,数组名代表了数组的起始地址。所以,以下两个表达式的值是相等的:
int a[10];
a == &a[0]
这里引出一个概念:数组指针。数组指针是指向数组起始地址的指针,其本质为指针。一维数组的数组名为一维数组的指针。
- 数组元素的表示
设指针变量px的地址值等于数组指针x(即指针变量px指向数组的首元数),则以下具有完全相同的功能(如图):
![]() |
x[i] 、*(px+i)、*(x+i) 和px[i]
下面,通过一个程序来加深理解:
程序执行结果如下:
得出结论:一维数组a的第i个元素,有下标法和指针法。假设指针变量p指向数组的首元素,则有四种数组元素的表达方式:
x[i] <==> *(px+i) <==> *(x+i) <==> px[i]
指针和数组的常见等价操作:
指针操作 | 数组操作 | 说明 |
array | &array[0] | 数组首地址 |
*array | array[0] | 数组的首元素 |
array + i | &array[i] | 数组的第i个元素地址 |
*(array + i) | array[i] | 数组的第i个元素 |
*array + b | array + b | 数组首元素的值加b |
*(array + i) + b | array[i] + b | 数组第i个元素的值加b |
*array++ | array[i++] | 先取得第i个数组的值,i再加1 |
*++array | array[++i] | 先将i加1,再取得第i个数组的值 |
*array- - | array[i- -] | 先取得第i个数组的值,i再减1 |
* - -array | array[- -i] | 先将i减1,再取得第i个数组的值 |
- 指针与多维数组
- 列指针遍历二维数组
多维数组就是具有两个或两个以上下标的数组,实际上,在C语言中并没有多维数组的概念,所谓多维数组就是低维数组的组合。依然可以理解为若干个相同类型的变量的集合,这里只介绍二维数组。
在C语言中,二维数组的元素连续存储,按行优先存,存储完第一行继续存第二行,以此类推。基于这个特点,可以用一级指针来遍历二维数组。
示例程序如下:
![]() |
程序运行结果如下:
从程序的输出结果,可以看到二维数组中各个元素的地址,由于一级指针p,p+i移动i个数,相当于移动了i列,因此也称指针p为列指针,该程序就是通过列指针对二维数组进行了遍历。
- 行指针遍历二维数组
行指针(数组指针)
存储行地址的指针变量,叫做行指针变量。形式如下:
-
- <存储类型> <数据类型> (*<指针变量名>)[表达式] ;
- 例如,int a[2][3]; int (*p)[3];
方括号中的常量表达式表示指针加1,移动几个数据。
当用行指针操作二维数组时,表达式一般写成1行的元素个数,即列数。有以下结论:
a[i][j] <==> *(*(p+i)+j) <==> *(a[i]+j) <==>*(p[i]+j)
示例程序:
![]() |
程序运行结果:
在该程序中,二维数组名和行指针在表达形式上非常类似。本质区别是数名是常量,指针是变量。