辨析指针数组与数组指针

2017-04-12 00:35张小军
关键词:运算符数据类型数组

张小军, 张 晶

(河南教育学院 信息技术系,河南 郑州 450046)

辨析指针数组与数组指针

张小军, 张 晶

(河南教育学院 信息技术系,河南 郑州 450046)

在C语言代码的编写过程中,指针数组与数组指针是经常用到的数据类型,其形式相近而意义迥然.正确理解这两个概念是使用C语言写好代码的前提.通过实例比较,阐述指针数组与数组指针的差异.

指针;指针数组;数组指针;地址;内存

由于C语言具有高级程序设计语言的特点,又具有汇编语言的特点,所以它不但可以作为系统设计语言用来编写系统软件,应用于单片机以及嵌入式系统开发等,还可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序,处理海量的数据,被广泛应用于各类信息的处理. 而指针数组与数组指针则是C语言中的重要数据类型,经常被使用.因为它们形式相近,很容易被混淆.下面从指针的概念开始,辨析指针数组与数组指针这两个概念,继而给出实例阐述这两个概念的区别[1].

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 指针数组与数组指针的应用分析

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

3 结束语

数组指针是指向数组的,而指针数组中的每一个元素都是指针.因为指针的本质是地址,所以,不管是哪种类型的指针,只要是类型匹配地址就可以存放.就像指针变量可以指向某个基本类型的变量一样,也可以定义指针变量来指向数组与数组元素.数组各个元素在内存中的存放是连续的,所以用指向数组或数组元素的指针变量来使用数组,令代码的编写与执行效率更高.

[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

猜你喜欢
运算符数据类型数组
JAVA稀疏矩阵算法
老祖传授基本运算符
JAVA玩转数学之二维数组排序
如何理解数据结构中的抽象数据类型
用手机插头的思路学习布尔运算符
Excel数组公式在林业多条件求和中的应用
基于SeisBase模型的地震勘探成果数据管理系统设计
线上众筹产品的特征分析与研究
相似度计算及其在数据挖掘中的应用
C语言中自增(自减)运算符的应用与分析