假设我们定义一个一维数组,该数组在内存会由系统分配一个存储空间,其数组的名字就是数组在内存的首地址。若再定义一个指针变量,并将数组的首地址传给指针变量,则该指针就指向了这个一维数组。我们说数组名是数组的首地址,也就是数组的指针。而定义的指针变量就是指向该数组的指针变量。对一维数组的引用,既可以用传统的数组元素的下标法,也可以使用指针的表示方法。
1.指向数组元素的指针
指向数组元素的指针变量的定义方法与普通指针变量的定义方法相同。
例如:int a[10],*p=&a[0],*q=&a[8];
将数组a的第1个元素的首地址赋给指针变量p,将数组a的第9个元素的首地址赋给指针变量q。
注意:在C语言中,数组名不仅是一个数组的标识符,而且还代表一个数组的首地址,它是一个地址常量,不是指针变量,所以不能对数组名进行赋值、自加、自减等运算。
例如:
a=p;
a++;
以上两条语句均非法。
数组名指向数组的首地址,数组第一个元素的首地址也是整个数组的首地址,因此,
以下两个语句等效,都是将数组a的首地址赋给指针变量p。
则p 就得到了数组的首址。其中,a 是数组的首地址,&a[0]是数组元素a[0]的地址,由于a[0]的地址就是数组的首地址,所以,两条赋值操作效果完全相同。指针变量p就是指向数组a的指针变量。同时,p+1或p++都是指向下一个元素,即指向a[1]。
2.通过指针引用数组元素
C语言规定:如果指针变量p已指向数组中的某个元素,则p+1表示指向同一数组的下一个数组元素,p-1表示指向同一数组的上一个数组元素,而不是将指针上、下移动一个字节。例如,若数组元素数据类型为char,则移动一个字节;若数组元素数据类型为int,则移动4个字节。
若p指向了一维数组,现在看一下C规定指针对数组的表示方法:
(1)p+n与a+n表示数组元素a[n]的地址,即&a[n]。对整个a数组来说,共有10个元素,n的取值为0~9,则数组元素的地址就可以表示为p+0~p+9或a+0~a+9,与&a[0]~&a[9]保持一致的。
(2)知道了数组元素的地址表示方法,*(p+n)和*(a+n)就表示为数组的各元素即等效于a[n]。
(3)指向数组的指针变量也可以用数组的下标形式表示为p[n],其效果相当于*(p+n)。
引入指针变量后,就可以用两种方法来访问数组元素了。
第一种方法为下标法,即用a[i]形式访问数组元素。在第7章中介绍数组时都是采用这种方法。(www.xing528.com)
第二种方法为指针法,即采用*(p+i)形式,用间接访问的方法来访问数组元素。
例如:
int a[10],*p=&a[0];
若p的初值为&a[0],则a+i 和p+i 是数组元素a[i]的地址,*(a+i)和*(p+i)是a+i和p+i指针所指向的数组元素。因此要表示数组a中下标为i的数组元素有4种方法,即:
【例9.5】从键盘输入10 个数,以数组的不同引用形式输出数组各元素的值。代码如表9.1所示。
表9.1 数组各元素输入/输出实现方法一览表
运行结果:
程序讲解:
本例程序(4)中,在程序中要注意*ptr++所表示的含义。*ptr指针所指向的变量;ptr++表示指针所指向的变量地址加1 个变量所占字节数。具体地说,若指向整型变量,则指针值加4个字节,依此类推。而"printf("%4d",*ptr++);"中,*ptr++所起作用为先输出指针指向的变量的值,然后指针变量加1。指针变量的值在循环结束后,指向数组的尾部的后面。假设元素a[9]的地址为1000,整型占4字节,则ptr的值就为1004。
思考:如果程序中,少了赋值语句"ptr=a;",程序的运行结果还相同吗?
【例9.6】用指针编写一维数组的排序程序,其中排序数据由随机函数生成。
程序代码:
运行结果:
程序讲解:
本例程序中,定义了整型一维数组a和指向整型数据的指针变量p。第一个for循环随机产生10 个100 以内的随机数,存储在数组a 中。其后的for 循环中使用指针变量p 对数组a进行冒泡排序,最后输出完成排序后的数组元素。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。