张小军, 张 晶
(河南教育学院 信息技术系,河南 郑州 450046)
辨析指针数组与数组指针
张小军, 张 晶
(河南教育学院 信息技术系,河南 郑州 450046)
在C语言代码的编写过程中,指针数组与数组指针是经常用到的数据类型,其形式相近而意义迥然.正确理解这两个概念是使用C语言写好代码的前提.通过实例比较,阐述指针数组与数组指针的差异.
指针;指针数组;数组指针;地址;内存
由于C语言具有高级程序设计语言的特点,又具有汇编语言的特点,所以它不但可以作为系统设计语言用来编写系统软件,应用于单片机以及嵌入式系统开发等,还可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序,处理海量的数据,被广泛应用于各类信息的处理. 而指针数组与数组指针则是C语言中的重要数据类型,经常被使用.因为它们形式相近,很容易被混淆.下面从指针的概念开始,辨析指针数组与数组指针这两个概念,继而给出实例阐述这两个概念的区别[1].
1.1 指针
指针的本质是一个地址,表现为一个十六进制的数据.在内存中,它占据4个字节的存储空间,是变量在内存当中的实际地址.一般通过指针位置的变化实现对指针所指向空间的内容操作,示例中变量和指针内存空间示意图如图1.
图1 变量a和指针p的内存地址
1.2 指针数组
指针数组(pointers of arrays),即用于存储指针的数组,也就是数组元素都是指针.若数组中的每一个元素都是指针,则该数组被称为指针数组.譬如,若有3个元素的数组,每个元素都是指向整型变量的指针,那么其类型定义的形式为int *p[2].换句话说,就是数组p中的元素都是int型的指针.一般情况下,我们使用*p[2]的形式,但有时候也会看到*(p[i])这种表示形式,这两者本质是一样.因为,在C语言的语法定义中,多个运算符之间是有优先级规定的.这里的运算符“[]”优先级高于运算符“*”.
int *p[3]; //是一个指针数组,定义了3个指针,分别为p[0]、p[1]、p[2]
int a0=1,a1=2,a2=3;
p[0]=&a0;p[1]=&a1;p[2]=&a2;
其内存空间示意图如图2.
图2 指针数组在内存中的地址
1.3 数组指针
数组指针(arrays of pointers),就是指向数组的一个指针.变量的定义形式:
数据类型(*变量名)[元素个数];
例如:int (*p);
由于“()”优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是4,也可以说是p的步长.也就是说执行p+1时,p要跨过4个整型数据的长度[2].
其内存空间示意图如图3.
图3 数组指针在内存中地址
2.1 代码示例
#include
main()
{
int i; //申明一个变量i
int *p[6]; //申明一个指针数组*p[6]
int (*q)[6]; //申明一个数组指针(*q)[6]
int s[6]={1,7,3,4,8,2}; //创建一个数组s[6]并赋值
q=s; //将数组s[6]赋值给数组指针(*q)[6]
for(i=0;i<6;i++) //创建一个for循环,将数组s[6]循环
*p[i]=s[i]; //赋值给指针数组*p[6]
printf("*p[3]=%d (*q)[3]=%d s[3]=%d",*p[3],(*q)[3],s[3]);
//输出*p[3],(*q)[3],s[3]
getch();
}
输出:
*p[3]=4
(*q)[3]=4
s[3]=4
2.2 指向一维数组的指针变量
定义方法:*指针变量名,即*p.
#include
main()
{
int a[5]={1,2,3,5,7};
int *p=a, i ;
for(i=0,i<5,i++)
printf("%4d",p[i]);
getch();
}
输出:1 2 3 5 7
2.3 指向二维数组的指针变量
定义方法:(*指针变量名)[长度],即(*p)[n].
main()
{
Int i,j,m,n,max;
Int a[3] [4]={1,2,3,4,5,6,7,8,9,10,11,12};
m=0;n=0;
max=**a;
for(i=0;i<4;i++)
{
printf(" ");
for(j=0;j<4;j++)
{
printf("%5d",*(*(a+i)+j));
if(max<*(*(a+i)+j))
{
max=*(*(a+i)+j));
m=i;i=j ;
}
}
}
printf(" max is :a[%2d][%2d]=%5d",m,n,max);
getch();
}
输出:
1 2 3 4
5 6 7 8
9 10 11 12
max is :a[2][3]=12
数组指针是指向数组的,而指针数组中的每一个元素都是指针.因为指针的本质是地址,所以,不管是哪种类型的指针,只要是类型匹配地址就可以存放.就像指针变量可以指向某个基本类型的变量一样,也可以定义指针变量来指向数组与数组元素.数组各个元素在内存中的存放是连续的,所以用指向数组或数组元素的指针变量来使用数组,令代码的编写与执行效率更高.
[1] 韩晓新.C语言中的指针教学[J].常州教育学院学报(综合版),2001,15(9):21.
[2] 宋灵香,赵静,刘运奇.分析指针数组与数组指针的区别和应用[J].甘肃高师学报,2012,17(2):51-52.
Differentiate the Array of Pointers and Pointer of Arrays
ZHANG Xiaojun, ZHANG Jing
(DepartmentofInformationTechnology,HenanInstituteofEducation,Zhengzhou450046,China)
In the coding process of C language, arrays of pointers and pointers of arrays are freequently used data types. The form and meaning of them are very similar. A correct understanding of these two concepts is the premise of using C language to write code. Based on examples, expounds the difference between arrays of pointers and pointers of arrays.
pointers; array of pointers; pointer of array; address; memory
2016-10-27
河南省高等学校重点科研项目计划(16A520008)
张小军(1980—),男,河南郑州人,河南教育学院信息技术系副教授,主要研究方向:计算机应用.
10.3969/j.issn.1007-0834.2017.01.016
TP312
A
1007-0834(2017)01-0068-04