c语言程序设计第6,C语言程序设计(第6章指针)6

c72ddcaf490f04dddb9a24c8b99b693b.png

6.6 指针数组

前面介绍了指向不同类型变量的指针的定义和使用,我们可以让指针指向某类变量,并替代该变量在程序中使用;我们也可以让指针指向一维、二维数组或字符数组,来替代这些数组在程序中使用,给我们在编程时带来许多方便。下面我们定义一种特殊的数组,这类数组存放的全部是指针,分别用于指向某类的变量,以替代这些变量在程序中的使用,增加灵活性。指针数组定义形式:

类型标识*数组名[数组长度]

例如: char *str[4];

由于[ ] 比*优先权高,所以首先是数组形式str[4 ],然后才是与“*”的结合。这样一来指针数组包含4个指针str [0]、str[1]、str[2]、str[3],各自指向字符类型的变量。例如: int *ptr[5]; 该指针数组包含5个指针ptr[0]、ptr[1]、ptr[2]、ptr[3]、ptr[4],各自指向整型类型的变量。

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

#include#includemain( )

{

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]); /* 依此输出p t r 1 数组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 - 1 2所示。

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

运行程序:

china

chengdu

sichuang

chongqin

1 2 3

1 2

2 4

5 6

在处理二维字符数组时,我们可以把二维字符数组看成是由多个一维字符数组构成,也就是说看成是多个字符串构成的二维字符数组,或称为字符串数组。指针数组对于解决这类问题(当然也可以解决其它问题)提供了更加灵活方便的操作。有一点需要说明,若定义一个指针数组后,指针数组各元素的取值(即地址)要注意安全性。

如定义指针数组:

char *ptr[3];

我们说该数组包含三个指针,但指针的指向是不确定的,指针现在可能指向内存的任一地址。假定现在作语句: scanf("%s", ptr[ i ] ), 则输入的字符串在内存的存放其地址由ptr[i]决定。除非给指针数组元素赋值安全的地址。

[例6-23] 定义字符指针数组,包含5个数组元素。同时再定义一个二维字符数组其数组大小为5 * 1 0,即5行1 0列,可存放5个字符串。若将各字符串的首地址传递给指针数组各元素,那么指针数组就成为名副其实的字符串数组。下面对各字符串进行按字典排序。

在字符串的处理函数中, strcmp(str1, str2)函数就可以对两个字符串进行比较,函数的返回值> 0、= 0、< 0分别表示串str1大于str2、str1等于str2、str1小于str2。再利用strcpy( )函数实现两个串的复制。下面选用冒泡排序法。

#include#include#includemain( )

{

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]);

}

运行程序:

jkjkdkddfs

fhfgkjkfgkf

hkfgkgfkklg

jjkdjdk

original string:

jkjkdkddfs

fhfgkjkfgkf

hkfgkgfkklg

jjkdjdk

ordinal string:

fhfgkjkfgkf

hkfgkgfkklg

jjkdjdk

jkjkdkddfs

程序中一定要注意指针的正确使用。一旦将二维字符数组的各行首地址传递给指针数组的各指针,则相当于给指针分配了安全可操作的地址,地址空间大小由二维字符数组来决定。当然也可由编译系统为指针分配地址用于字符串的存放。

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

#include#include#includemain( )

{

char *ptr1[4],*temp;

int i,j;

for (i=0;i<4;i++)

{

ptr1[i] = malloc(20); / *为指针数组各指针分配2 0字节的存储空间* /

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 - 2 3完全相同。

2829f2ca24f0d0090cbba57f30759f23.png

C语言程序设计(第6章指针)6.doc

下载Word文档到电脑,方便收藏和打印[全文共2749字]

编辑推荐:

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

8b95f2eb3d3f7ce4dc3bf1178c74941e.png

下载Word文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值