c语言单元测试第六章指针,C语言教程第六章:指针(6)

本文详细介绍了数组和指针在C语言中的应用,包括如何使用指针指向二维数组,以及如何通过指针进行数组元素的访问和操作。程序示例展示了如何初始化和操作指向字符串的数组,以及如何利用指针对数组进行排序,强调了数组和二维数组变量之间的区别。此外,还讨论了在处理大量字符串时,如何通过交换指针而非字符串本身提高程序效率。
摘要由CSDN通过智能技术生成

数组说明的一般形式为: 类型说明符*数组名[数组长度]

其中类型说明符为值所指向的变量的类型。例如: int *pa[3] 表示pa是一个数组,它有三个数组元素, 每个元素值都是一个,指向整型变量。通常可用一个数组来指向一个二维数组。 数组中的每个元素被赋予二维数组每一行的首地址, 因此也可理解为指向一个一维数组。图6—6表示了这种关系。

int a[3][3]={1,2,3,4,5,6,7,8,9};

int *pa[3]={a[0],a[1],a[2]};

int *p=a[0];

main(){

int i;

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

printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i));

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

printf("%d,%d,%d\n",*pa[i],p[i],*(p+i));

}  本例程序中,pa是一个数组,三个元素分别指向二维数组a的各行。然后用循环语句输出指定的数组元素。其中*a[i]表示i行0列元素值;*(*(a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由于p与a[0]相同,故p[i]表示0行i列的值;*(p+i)表示0行i列的值。读者可仔细领会元素值的各种不同的表示方法。 应该注意数组和二维数组变量的区别。 这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的。

二维数组变量是单个的变量,其一般形式中"(*变量名)"两边的括号不可少。而数组类型表示的是多个( 一组有序)在一般形式中"*数组名"两边不能有括号。例如: int (*p)[3];表示一个指向二维数组的变量。该二维数组的列数为3或分解为一维数组的长度为3。 int *p[3] 表示p是一个数组,有三个下标变量p[0],p[1],p[2]均为变量。

数组也常用来表示一组字符串, 这时数组的每个元素被赋予一个字符串的首地址。 指向字符串的数组的初始化更为简单。例如在例6.20中即采用数组来表示一组字符串。 其初始化赋值为:

char *name[]={"Illagal day",

"Monday",

"Tuesday",

"Wednesday",

"Thursday",

"Friday",

"Saturday",

"Sunday"};  完成这个初始化赋值之后,name[0]即指向字符串"Illegal day",name[1]指?quot;Monday"......。

数组也可以用作参数。在本例主中,定义了一个数组name,并对name 作了初始化赋值。其每个元素都指向一个字符串。然后又以name 作为实参调用型day name,在调用时把数组名 name 赋予形参变量name,输入的整数i作为第二个实参赋予形参n。在day name中定义了两个变量pp1和pp2,pp1被赋予name[0]的值(即*name),pp2被赋予name[n]的值即*(name+ n)。由条件表达式决定返回pp1或pp2给主中的变量ps。最后输出i和ps的值。

数组作型的参数main(){

static char *name[]={ "Illegal day",

"Monday",

"Tuesday",

"Wednesday",

"Thursday",

"Friday",

"Saturday",

"Sunday"};

char *ps;

int i;

char *day_name(char *name[],int n);

printf("input Day No:\n");

scanf("%d",&i);

if(i<0) exit(1);

ps=day_name(name,i);

printf("Day No:%2d-->%s\n",i,ps);

}

char *day_name(char *name[],int n)

{

char *pp1,*pp2;

pp1=*name;

pp2=*(name+n);

return((n<1||n>7)? pp1:pp2);

}

下例要求输入5个国名并按字母顺序排列后输出。在以前的例子中采用了普通的排序方法, 逐个比较之后交换字符串的位置。交换字符串的物理位置是通过字符串复制完成的。 反复的交换把使程序执行的速度很慢,同时由于各字符串(国名) 的长度不同,又增加了存储管理的负担。 用数组能很好地解决这些问题。把所有的字符串存放在一个数组中, 把这些字符数组的首地址放在一个数组中,当需要交换两个字符串时, 只须交换数组相应两元素的内容(地址)即可,而不必交换字符串本身。程序中定义了两个,一个名为sort完成排序, 其形参为指

针数组name,即为待排序的各字符串数组的。形参n为字符串的个数。另一个名为print,用于排序后字符串的输出,其形参与sort的形参相同。主main中,定义了数组name 并作了初始化赋值。然后分别调用sort和print完成排序和输出。值得说明的是在sort中,对两个字符串比较,采用了strcmp ,strcmp允许参与比较的串以方式出现。name[k]和name[ j]均为,因此是合法的。字符串比较后需要交换时, 只交换数组元素的值,而不交换具体的字符串, 这样把大大减少时间的开销,提高了运行效率。

现编程如下:

#include"string.h"

main(){

void sort(char *name[],int n);

void print(char *name[],int n);

static char *name[]={ "CHINA","AMERICA","AUSTRALIA",

"FRANCE","GERMAN"};

int n=5;

sort(name,n);

print(name,n);

}

void sort(char *name[],int n){

char *pt;

int i,j,k;

for(i=0;ik=i;

for(j=i+1;jif(strcmp(name[k],name[j])>0) k=j;

if(k!=i){

pt=name[i];

name[i]=name[k];

name[k]=pt;

}

}

}

void print(char *name[],int n){

int i;

for (i=0;i}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值