62指针数组和指向的_第1页
62指针数组和指向的_第2页
62指针数组和指向的_第3页
62指针数组和指向的_第4页
62指针数组和指向的_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、62指针数组和指向指针的指针一、指针数组的概念一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为:类型名 *数组名数组长度;例如:*p4;由于比 *优先级高,因此 p 先4结合,形成 p4形式,这显然是数组形式,他有 4 个元素。然后再与 p 前面的“*”结合,“*”表示此数组是指针类型的,每个数组元素(相当于一个指针变量)都可指向一个整型变量。注意不要写成:(*p)4;这是指向一维数组的指针变量。之所以用到指针数组,是因为它比较适合于用来指向若干个字符串,使字符串处理更加方便灵活。例如馆有若干本书,想把书名放到一个

2、数组中(图 1(a),然后要对这些书目进行排序和检查。按一般方法,字符串本身就是一个字符数组。因此要设计一个二维的字符数组才能存放多个字符串。但在定义二维数组时,需要指定列数,也就是说二维数组中每一行中包含的元素个数(即列数)相等。而实际上各字符串(书名)长度一般是不相等的。如按最长的字符串来定义列数,则会浪费许多内存单元,见图 1(b)。可以分别定义一些字符串,然后用指针数组中的元素分别指向各字符串,见图 1(c)。如果想对字符串排序,不必改动字符串的位置,只需改动指针数组中各元素的指向(即改变各元素的值,这些值是各字符串的首地址)。这样各字符串的长度可以不同,而且移动指针变量的值(地址)要

3、比移动字符串所花的时间少。例 将若干个字符串按字母顺序(由大到小)输出。#include#includevoidmain()voidsort(char*name,n);voidpr(char*name,n);char*name=“Followme”,”BASIC”,”GreatWall”,”FORTARN”,”Computerdesign”;n=5;sort(name,n);pr(name,n);voidsort(char*name,n)char*temp;i,j,k;for(i=0;in-1;i+)k=i;for(j=i+1;j0)k=j;if(k!=i)temp=namei;namei=n

4、amek;namek=temp;voidpr(char*name,n)i;for(i=0;in;i+)prf(“%sn”,namei);运行结果为:BASICComputerdesignFORTARNFollowmeGreatWall在 main 函数中定义指针数组 name,它有 5 个元素,其初值分别为“Followme”,”BASIC”,”GreatWall”,”FORTARN”和”Computerdesign”第一个字符的地址,见图 1(c)。这些字符串是不等长的(并不是按同一长度定义的)。sort 函数的作用是对字符串排序。sort 函数的形参 name 也是指针数组名,接受实参传过

5、来的 name 数组 0 行的地址,因此形参 name数组和实参 name 数组指的是同一数组。用选择对字符串排序。strcmp是字符串比较函数,namek和 namej是第 k 个和第 j 个字符串的起始地址。strcmp(namek,namej)的值为:如果 namek所指的字符串大于 namej所指的字符串,则此函数值为正值;若相等,则函数值为 0;若小于,则函数值为负值。if 语句的作用是将两个串中“小”的那个串的序号(k 或 j 之一)保留在变量 k 中。当执行完内循环 for语句后,从第 i 串到第 n 串这些字符串中,第 k 串最“小”。若 ki就表示最小的串不是第 i 串。故将

6、 namei和 namek对换,也就是将指向第 i 串的数组元素(是指针型元素)的值与指向第 k 串的数组元素的值对换。执行完 sort 函数后指针数组的情况如图 2 所示。pr函数的作用是输出各字符串。name0到 name4分别是各字符串(按从小到大顺序排好序的各字符串)的首地址(按字符串从小到大顺序,name0指向最小的串),用“%s”格式符输出,就得到这些字符串。pr函数也可以改写成以下形式:voidpr(char*name,n)i;char*p;p=name0;while(i*namej)k=j;这样只比较 namek和 namej所指向的字符串中的第一个字符。字符串比较应当用 st

7、rcmp 函数。二、指向指针的指针从图 3 可以看到,name 是一个指针数组,它的每一个元素是一个指针型数据,其值为地址。name 是一个数组,它的每一个元素都有相应的地址,数组名 name 代表该指针数组首元素的地址。name+i是 namei的地址。name+i 就是指向指针型数据的指针。还可以设置一个指针变量 p,它指向指针数组的元素(见图 4)。p 就是指向指针型数据的指针变量。那么,怎么定义一个指向指针数据的指针变量?例如:char*p;p 的前面有两个*号。从附录可以知道,*运算符的结合性是从右到左,因此*p 相当于*(*p),显示*p 是指针变量的定义形式。如果没有最前面的*,

8、那就定义了一个指向字符数据的指针变量。现在它前面又有一个*号,表示指针变量 p 是指向一个字符指针变量(即指向字符型数据的指针变量)的。*p 就是 p 所指向的另一个变量指针,如果有:p=name+2;prf(“%on”,*p);prf(“%sn”,*p);第一个 prf 函数语句输出 name2的值(它是一个地址),第二个 prf 函数语句以字符串形式(%s)输出字符串“GreatWall”。例 使用指向指针变量的指针。#includevoidmian()char*name=“Followme”,”BASIC”,”GreatWall”,”FORTARN”,”Computerdesign”;c

9、har*p;i;for(i=0;i5;i+)p=name+i;prf(“%sn”,*p);运行结果如下:BASICComputerdesignFORTARNFollowmeGreatWallp 是指向指针的变量,在第一次执行循环体时,赋值语句“p=name+i;”使 p 指向 name 数组的 0 号元素 name0,*p 是 name0的值,即第一个字符串的起始地址,用 prf 函数输出第一个字符串(格式符为%s)。执行 5 次循环体,依次输出 5 个字符串。指针数组的元素也可以不指向字符串,而指向整形数据或实型数据等,例如:a5=1,3,5,7,9;*num5,i;*p;for(i=0;i

10、5;i+)numi=&ai;此时为了得到 a2中的数据 5,可以先使 p=num+2,然后输出*p。注意*p 是 p 间接指向的对象的地址 num2。而*p 是 p 间接指向的对象的值,即*num2,也就是 a2的值 5,见图 4。例 指针数组的元素指向整型数据。这是一个简单的例子,目的是为了说明它的用法。#includevoidmain()a5=1,3,5,7,9;*num5=&a0, &a1, &a2, &a3, &a4;*p,i;p=num;for(i=0;i1)+argv;prf(“%sn”,*argv);-argc;在 DOS 命令状态下输入令行为file1ChinaBeijing则

11、执行以上命令行将会输出以下信息:ChinaBeijing上面的 main 函数可以改写为:voidmian(argc,char*argv)while(argc-1)prf(“%sn”,*+argv);其中*+argv 是先进行+argv 的运算,使 argv 指向下一个元素,然后进行*的运算,找到 argv 当前指向的字符串,输出该字符串。在开始时,argv 指向字符串“file1”,+argv 使之指向“China”,所以第一次输出的是“China”,第二次输出的是“Beijing”。许多操作系统提供了 echo 命令,它的作用是实现“参数回送”,即将 echo 后面的各参数(各字符串)在同

12、一行上输出。实现“参数回送”的 C 程序(文件名为 echo.c)如下:#includevoidmian(argc,char*argv)while(argc-1)prf(“%s%c”,*+argv,(argc1)? :n);如果命令行输入:cechoComputerandCLanguage会在显示屏上输出:ComputerandCLanguage这个程序与前面的差别在于:1样的。将 while 语句中的(argc-1)改为(-argc0)的作用是一2当 argv1 时,在输出的两个字符串间输出一个空格,当argc=1 时输出一个换行。程序不输出命令名“echo”。为便于理解,echo 程序也可写成以下形式:#includevoidmian(argc,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论