• 沒有找到結果。

多级指针与指针数组

} } 程序运行结果:

No.1 grade list:55 65 75 程序说明如下:

(1)主函数中的 pointer=seek(grade+i);语句调用 seek()函数时,将实参 grade+i(行指针)

的值复制到形参 pnt_row(行指针变量)中,使形参 pnt_row 指向 grade 数组的第 i 行。

(2)在指针函数 seek()中:

1)pnt_col=*(pnt_row+1);语句中的*(pnt_row+1)将行指针转换为列指针,指向 grade 数组 的第 i+1 行第 0 列,并赋值给(列)指针变量 pnt_col。

2)if(*(*pnt_row+i)<60)行中的 pnt_row 是一个行指针,指向数组 grade 的第 i 行;*pnt_row 使指针由行转换为列,指向数组 grade 的第 i 行第 0 列;*pnt_row+j 的值还是一个指针,指向 数组的第 i 行第 j 列;*(*pnt_row+j)是一个数据(数组元素 grade[i][j]的值)。

6.4 多级指针与指针数组

6.4.1 多级指针 1.概念

在前面的叙述中,一个指针变量可以指向一个相应数据类型的数据,例如:

int a,*p;

p=&a;

使指针 p 指向 a,则指针 p 所指向的变量*p 就是要处理的数据变量 a。如果同时存在另一 个指针 pp,并且把指针 p 的地址赋予指针变量 pp,即:pp=&p;,则 pp 就指向指针 p,这时 指针 pp 所指向的变量*pp 就是指针 p,pp 就是一个二级指针。

2.定义格式

数据类型 **指针变量[,**指针变量 2,…];

【例 6.22】用二级指针处理多个字符串。

#include "stdio.h"

main() {

static char *name[]={"Follow me","BASIC","FORTRAN","Great Wall", "Computerdesign"};

char**p;

int i;

for(i=0;i<5;i++) { p=name+i;

printf("%s\n",*p);

} }

程序运行结果如下:

Follow me BASIC FORTRAN Great Wall Computerdesign

指针数组的元素也可以不指向字符串,而指向整型数据或浮点型数据等,例如:

int a[5]={1,3,5,7,9};

int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};

int **p;

void sort(char *name[],int count) { char*temp_p;

int i,j,min;

/*使用选择法排序*/

for(i=0;i<count-1;i++) /*外循环:控制选择次数*/

{min=i; /*预置本次最小串的位置*/

for(j=i+1;j<count;j++) /*内循环:选出本次的最小串*/

if(strcmp(name[min],name[j])>0) /*存在更小的串*/

min=j; /*保存之*/

if(min!=i) /*存在更小的串,交换位置*/

{temp_p=name[i];name[min];name[min]=temp_p;}

} }

/*主函数 main()*/

main()

{ char*name[5]={"BASIC","FORTRAN","PASCAL","C","FoxBASE"};

int i=0;

sort(name,5); /*使用字符指针数组名作实参,调用排序函数 sort()*/

/*输出排序结果*/

for(;i<5;i++)

printf("%s\n",name[i]);

}

程序运行结果:

BASIC C FORTRAN FoxBASE PASCAL 程序说明如下:

(1)实参对形参的值传递如下:

sort( name , 5);

↓ ↓ void sort(char*name[],int count)

(2)字符串的比较只能使用 strcmp()函数。形参字符指针数组 name 的每个元素,都是一 个指向字符串的指针,所以有 strcmp(name[min],name[j])。

(3)程序中没有使用二维字符数组,而是采用指针数组 name。可以看到指针数组比二维 字符数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度,

二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。

6.4.3 main 函数的参数

指针数组的一个重要应用是作为 main 函数的形参。在前面讲述的程序中,main 函数的第 一行全部写成了以下形式:

main()

括号中为空,表示没有参数。实际上 main 函数是可以带参数的,其一般形式为:

main(argc,argv)

int argc; /*argc 表示命令行参数个数*/

char *argv[]; /*argv 是指向命令行参数的指针数组*/

argc 和 argv 是 main 函数的形式参数。

在操作系统下运行 C 程序时,可以以命令行参数形式,向 main 函数传递参数。命令行参 数的一般形式是:

运行文件名 参数 1 参数 2 …… 参数 n

运行文件名和参数之间、各个参数之间要用一个空格分隔。

argc 表示命令行参数个数(包括运行文件名),argv 是指向命令行参数的数组指针。指针 argv[0]指向的字符串是运行文件名,argv[1]指向的字符串是命令行参数 1,argv[2]指向的字符 串是命令行参数 2,……。

【例 6.24】下列文件的运行文件的文件名为 TEST1,按数组方式引用命令行的参数。

/*程序功能:main 函数的参数应用实例*/

#include"stdio.h"

main(argc,argv) int argc;

char*argv[];

{ int i;

printf("argc=%d\n",argc); /*输出参数 argc 的值*/

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

printf("%s\n",argv [i]); /*按数组方式引用命令行的参数*/

}

设在操作系统提示符下运行程序,为了运行程序,输入的命令行参数为:

TEST1 IBM-PC COMPUTER 则执行程序后输出结果为:

argc=3 TEST1 IBM-PC COMPUTER

这样利用指针数组作为主函数 main 的形式参数,可以很方便地实现 main 函数与操作系 统的通信。

相關文件