当前位置:天才代写 > tutorial > C语言/C++ 教程 > 指针数组(一)

指针数组(一)

2017-11-04 08:00 星期六 所属: C语言/C++ 教程 浏览:511

副标题#e#

前面先容了指向差异范例变量的指针的界说和利用,我们可以让指针指向某类变量,并替代该变量在措施中利用;我们也可以让指针指向一维、二维数组或字符数组,来替代这些数组在措施中利用,给我们在编程时带来很多利便。

下面我们界说一种非凡的数组,这类数组存放的全部是指针,别离用于指向某类的变量,以替代这些变量在措施中的利用,增加机动性。指针数组界说形式:

范例标识 *数组名[数组长度]

譬喻: char *str[4];

由于[ ] 比*优先权高,所以首先是数组形式str[4 ],然后才是与“*”的团结。这样一来指针数组包括4个指针s t r [ 0 ]、s t r [ 1 ]、s t r [ 2 ]、s t r [ 3 ],各自指向字符范例的变量。譬喻:

int *p t r [ 5 ] ;

该指针数组包括5个指针p t r [ 0 ]、p t r [ 1 ]、p t r [ 2 ]、p t r [ 3 ]、p t r [ 4 ],各自指向整型范例的变量。

[例6-22] 针对指针数组的应用,我们别离用指针数组的各指针指向字符串数组、指向一维整型数组、指向二维整型数组。

#include <stdlib.h>
#include <stdio.h>
m a i n ( )
{
char *ptr1[4]={"china","chengdu","sichuang","chongqin"};
/* 指针数组p t r 1 的4个指针别离依此指向4个字符串* /
int i,*ptr2[3],a[3]={1,2,3},b[3][2]={1,2,3,4,5,6};
for(i=0;i<4;i++)
printf("\n%s",ptr1[i]);/依*此输出ptr1数组4个指针指向的4个字符串*/
printf("\n");
for(i=0;i<3;i++)
ptr2[i]=&a[i];/*将整型一维数组a的3个元素的地点通报给指针数组ptr2*/
for(i=0;i<3;i++)/*依此输出ptr2所指向的3个整型变量的值*/
printf("%4d",*ptr2[i]);
printf("\n");
for(i=0;i<3;i++)
ptr2[i]=b[i];/*通报二维数组b的每行首地点给指针数组的4个指针*/
for(i=0;i<3;i++)/*按行输出*/
printf("%4d%4d\n",*ptr2[i],*ptr2[i]+1);
}

措施中指针数组与所指工具的干系如图6-12所示。

指针数组(一)

ptr1指针数组中的4个指针别离指向4个字符串,如图6-11的a)所示,措施中依此输出;ptr2指针数组共有3个指针,若将整型一维数组a中各元素地点别离通报给指针数组的各指针,则ptr2[0]就指向a[0];ptr2[1]就指向a[1];ptr2[2]就指向a[2]。若将二维数组各行的首地点别离通报给指针数组的各指针,如图6-11b)所示,这样一来,ptr2[0]就指向了b数组的第0行,该行有两个元素,其地点为ptr2[0]与ptr2[0]+1;相应指针数组第i个元素ptr2[i]指向的b数组的第i行两个元素地点别离为ptr2[i]与ptr[i]+1。

指针数组(一)


#p#副标题#e#

在处理惩罚二维字符数组时,我们可以把二维字符数组当作是由多个一维字符数组组成,也就是说当作是多个字符串组成的二维字符数组,或称为字符串数组。

指针数组对付办理这类问题(虽然也可以办理其它问题)提供了越发机动利便的操纵。

有一点需要说明,若界说一个指针数组后,指针数组各元素的取值(即地点)要留意安详性。

如界说指针数组:

char *ptr[3];

我们说该数组包括三个指针,但指针的指向是不确定的,指针此刻大概指向内存的任一地点。假定此刻作语句:scanf("%s",ptr[i]),则输入的字符串在内存的存放其地点由ptr[i]抉择。除非给指针数组元素赋值安详的地点。

[例6-23]界说字符指针数组,包括5个数组元素。同时再界说一个二维字符数组其数组巨细为5*10,即5行10列,可存放5个字符串。若将各字符串的首地点通报给指针数组各元素,那么指针数组就成为名副其实的字符串数组。下面临各字符串举办按字典排序。

在字符串的处理惩罚函数中,strcmp(str1,str2)函数就可以对两个字符串举办较量,函数的返回值>0、=0、<0别离暗示串str1大于str2、str1便是str2、str1小于str2。再操作strcpy()函数实现两个串的复制。下面选用冒泡排序法。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
main()
{
char *ptr1[4],str[4][20],temp[20];
/*界说指针数组、二维字符数组、用于互换的一维字符数组*/
int i,j;
for(i=0;i<4;i++)
gets(str[i]);/*输入4个字符串*/
printf("\n");
for(i=0;i<4;i++)
ptr1[i]=str[i];/*将二维字符数组各行的首地点通报给指针数组的各指针*/
printf("original string:\n");
for(i=0;i<4;i++)/*按行输出原始各字符串*/
printf("%s\n",ptr1[i]);
printf("ordinal string:\n");
for(i=0;i<3;i++)/*冒泡排序*/
for(j=0;j<4-i-1;j++)
if(strcmp(ptr1[j],ptr1[j+1])>0)
{strcpy(temp,ptr1[j]);
strcpy(ptr1[j],ptr1[j+1]);
strcpy(ptr1[j+1],temp);
}
for(i=0;i<4;i++)/*输出排序后的字符串*/
printf("%s\n",ptr1[i]);
}

指针数组(一)

#p#副标题#e#

#p#分页标题#e#

措施中必然要留意指针的正确利用。一旦将二维字符数组的各行首地点通报给指针数组的各指针,则相当于给指针分派了安详可操纵的地点,地点空间巨细由二维字符数组来抉择。

虽然也可由编译系统为指针分派地点用于字符串的存放。

[例6-24]操作malloc()函数为指针分派存储空间,实现字符串的排序。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
main()
{
char *ptr1[4],*temp;
int i,j;
for(i=0;i<4;i++)
{
ptr1[i]=malloc(20);/*为指针数组各指针分派20字节的存储空间*/
gets(ptr1[i]);
}
printf("\n");
printf("original string:\n");
for(i=0;i<4;i++)
printf("%s\n",ptr1[i]);
printf("ordinal string:\n");
for(i=0;i<3;i++)
for(j=0;j<4-i-1;j++)
if(strcmp(ptr1[j],ptr1[j+1])>0)
{
temp=ptr1[j];/*操作指向字符串的指针,举办指针地点的互换*/
ptr1[j]=ptr1[j+1];
ptr1[j+1]=temp;
}
for(i=0;i<4;i++)/*字符串输出*/
printf("%s\n",ptr1[i]);
}

运行措施,其功效与上述例6-23完全沟通。

 

    关键字:

天才代写-代写联系方式