指针(二)

  • 格式:doc
  • 大小:24.00 KB
  • 文档页数:2

第十一讲指针(二)
本讲主要介绍了返回指针值的函数、指向函数的指针、指针数组、指针与多维数组、指向指针的指针以及命令行参数,要求掌握分别指向函数、数组、指针的指针变量的定义和引用,掌握指针数组处理若干字符串的方法,掌握main()函数形参的定义和使用,了解指向数组的指针与指针数组、指向函数的指针变量与定义返回值是指针的函数的区别。

知识要点
∙返回指针值的函数
1. 返回指针值的函数的定义
∙指向函数的指针
1. 指向函数的指针的定义
2. 使用指向函数的指针调用函数的方法
∙指针数组
1. 指针数组的定义和应用
2. 指针与多维数组
3. 指向二维数组的元素的指针变量的定义和使用
4. 指向二维数组中一维数组的指针变量的定义和使用
5. 指向数组的指针变量和指针数组的区别
∙指向指针的指针
1. 指向指针的指针变量的定义和引用
∙命令行参数
1. 处理命令行参数的main()函数的定义
2. 定义main(int argc,char *argv[ ])中argc、argv的含义
§11.1 返回指针值的函数
返回值为指针型数据的函数,定义的一般形式为:
类型名 * 函数名(参数表);
§11.2 指向函数的指针
一、指向函数的指针的定义
指向函数的指针变量定义的一般形式为:
类型名(* 指针变量名)();
二、指向函数的指针的引用
C语言规定函数名就是函数的入口地址。

所以当指向函数的指针变量等于一个函数名时,表示该指针变量指向函数。

此时可以通过指向函数的指针变量调用该函数。

即一般调用函数的形式是
函数名(实参表)
改为指向函数的指针变量调用函数时,调用形式变为
(*指针变量名)(实参表)
指向函数的指针变量在使用时要注意:由于这类指针变量等于一个函数的入口地址,所以它们作加减运算是无意义的。

§11.3 指针数组
指针数组定义的形式为:
类型名 *数组名[常量表达式];
指针数组的主要用于管理同种类型的指针,其中最常用在处理若干个字符串(如二维字符数组)的操作。

§11.4 指针与多维数组
不带任何下标的二维数组名表示二维数组的起始地址,对其进行加法操作时则表示作为其元素的一个一维数组(即二维数组一行)的起始地址。

只带一维下标的二维数组名表示作为其元素的一个一维数组(即二维数组一行)的起始地址,对其进行加法操作时表示该一维数组(即二维数组一行)的一个元素的地址。

一、指向二维数组元素的指针变量
在C语言中指针即是地址,如果指针变量等于只带一维下标的二维数组名,它的定义、赋值、引用与指向一维数组元素的指针变量形式相同,例如
int a[2][3],*p;
p=a[0];
此时p指向一维数组a[0]的起始地址,即p、a[0]、&a[0][0]相同。

对其进行加法操作时p+1等同于a[0]+1,都指向数组元素a[0][1]。

所以*(p+1)等于元素a[0][1]的值。

二、指向二维数组中一维数组的指针变量
C 语言规定一种指针变量,如果该指针变量等于不带任何下标的二维数组名,指针变量指向作为二维数组元素的一个一维数组(即二维数组的一行),这样对指针变量进行加减操作则指针将在二维数组中的行上移动。

这种指针变量的定义形式如下:
类型符 (*指针变量名)[指向的一维数组元素的个数]
那么对于一个由2行3列组成的二维数组a[2][3],如果指针变量p指向这个二维数组中包含3个元素的第一行一维数组,则指针变量p的定义和赋值形式如下:
int a[2][3], (*p)[3];
p=a;
此时p指向二维数组a的起始地址。

对其进行加法操作时p+1等同于a+1,指向包含3个元素的一维数组a[1]。

所以*(p+1)等于一维数组名a[1],*(p+1)+1等于a[1]+1,所以*(*(p+1)+1)等于a[1][1]。

指向数组的指针变量在使用时,要注意与元素是指针类型的指针数组的区别。

例如:
int (*q)[3],*p[3];
q是指向一个包含3个整型元素的一维数组的指针变量,p是一个由p[0]、p[1]、p[2]共3个指向整型数据的指针组成的一维数组。

§11.5 指向指针的指针
指针的地址可以赋给另一个指针变量,这另一个指针变量就称为指向指针的指针。

指向指针的指针定义的一般形式为:
类型名 ** 指针变量名;
例如: int **p;
表示p是一个指向int型指针变量的指针。

§11.6 命令行参数
C语言允许main函数带两个参数。

带参数的main函数的一般形式为:
main(int argc,char *argv[ ])
{ }
其中,参数argc为整型,是命令行中参数的个数,命令名也作为一个参数。

argv为指向字符串的指针数组,它的元素依次指向命令行中的各个字符串,包括命令名。

学以致用
1.修改第八讲“学以致用”的第3题,要求函数string_cut(char *string,char c)的返回值为字符串的地址。

2.编写并验证去掉字符串中前导空格的函数char *head_cls(char *str)。

3.修改例11.9,已知学生库char *name[6]={“Join”,”Mary”,”Lily”,”Bob”,”Williams”,”White”};要求根据输
入学生姓名查找该学生是第几个。

4.利用main函数可以读取命令行参数,建立文件like.c。

当命令行有2个参数时,例如like football ,
输出Do you like football? 当命令行有3个参数时,例如like football basketball 时,输出Do you like football or basketball? 当命令行有4个以上参数时,例如like C Vb Foxpro Java 时输出Do you like C,Vb,Foxpro or Java?
5.根据例11.10进一步完善“学生成绩管理系统”。