内容正文:
第10章 指针的高级应用
内容概述
指向多维数组的指针
指向函数的指针
返回指针值的函数
指针数组
指向指针的指针
复习数组的指针的含义,学习通过指针引用多维数组的元素,了解指向数组的指针作为函数参数的传递过程 ;
了解函数指针的概念,正确地利用指针调用函数;
掌握返回指针的函数的定义和调用;
初步认识指向指针的指针,进而理解指针数组的应用;
教学目标
10.3 二级指针
a
10
p
&a
p2
&p
变量
一级指针
二级指针
10.3.1 多级指针的概念
指针变量在内存中仍有一个存储单元,该单元的地址,即指针的指针。
二级指针是指向一级指针的指针,即二级指针中存放的是一级指针的地址。类似地,三级指针是指向二级指针的指针,存放的是二级指针的地址。
10.3.2 二级指针的定义和使用
二级指针的定义形式:
[存储类型] 数据类型 **指针名;
例如:
int a,*p,**q;
p=&a;
q=&p;
指针p存放变量a的地址,即指针p指向变量a,指针p是一级指针;指针q存放一级指针p的地址,即指针变量q指向变量p,因此,指针q是二级指针。这样定义之后,既可以用一级指针也可以用二级指针访问变量a,即a、*p、**q都表示访问变量a的值,三者是等价的。
【例10.7】利用指向字符指针的指针打印字符串数组。
main()
{
char *name[]={"China","India","Japan","America","Canada"};
char **p;
int i;
for(i=0;i<5;i++)
{
p=name+i;
printf("%10s",*p);
}
}
10.4 指针数组作main函数的形参
main函数也可以带形式参数。C语言规定main函数的参数只能有两个,这两个形式参数的名字其实可以随意取,但一般习惯记作argc和argv,它们的类型与顺序必须与参数表中规定的相一致。可以用下面的形式来定义main函数:
main(int argc,*argv[]) 或
main(int argc,**argv)
其中,argc是命令行中的参数个数(可执行文件名本身也算一个);argv是一个指向字符串的指针数组,用来存放命令行中的各个参数的首地址。
实参由执行程序的命令行提供。命令行可以带任意个参数,参数与参数之间必须以空格分隔。其形式为
命令名 参数1 参数2 … 参数n
观察DOS系统下的一种命令:
c:\> copy FILE1.C FILE2.C
其中,copy为命令,FILE1.C 和FILE2.C为其参数。
【例10.8】输出命令行中的各个参数字符串。
main(int argc,char *argv[])
{ while(argc>1)
{
++argv;
printf("%s
",*argv);
--argc;
}
}
保存文件test.c,编译链接后得到可执行文件test.exe,进入DOS操作系统,在当前盘、当前目录下输入
test China Beijing
输出结果:
China
Beijing
复杂的声明形式
复杂类型变量的声明容易混淆
指针数组和指向数组的指针
int *a[5]; int (*a)[5];
指向函数的指针和返回指针值的函数
void (*f)(); void *f();
过于复杂的声明形式使程序晦涩难懂,而且容易出错
可以用typedef关键字把复杂类型的变量声明用若干个容易理解的小步骤表示
分析声明形式的方法
从标识符开始,逐层分析其意义
按运算符优先级和结合方向的顺序进行
可能涉及的运算符包括
()自左向右结合
改变结合顺序;或声明一个函数,向外一层是函数返回值类型声明
[]自左向右结合
声明一个数组,向外一层是数组元素类型声明
* 自右向左结合
声明一个指针类型,向外一层是指针基类型声明
声明形式分析举例
char (*(*x[3])())[5];
x是一个长度为3的数组
数组的元素是指针类型
指针是指向函数的
函数的返回值是指针类型
指向长度为5的字符数组
程序调试题:调用函数f,求二维数组a中全体元素之和。
#include <stdio.h>
float f( _______1_______)
{ float y=0; int i,j;
for(i=0;i<m;i++) for(j=0;j<n;j++) y=y+*(*(x+i)+j);
return y;
}
void main()
{ float a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},*b[3];
int i;
for(i=0;i<3;i++) b[i]=___2___;
printf("%.2f
",f(b,3,4));
}
(1) float *x[],mint m,int n
(2) a[i]
练 习
下面程序的运行结果是
#include”stdio.h”
#include”string.h”
void main()
{char a[10]=“AB”,b[10]=“LMNP”;
int i=0;
strcat(a,b);
while(a[i++]!=‘\0’) b[i]=a[i];
puts(b);
}
(a) LB (b ) ABLMNP ( c) AB (d) LBLMNP
√
练 习
写出下面程序的运算结果
#include <stdio.h>
#include <string.h>
void main()
{ char c,*a="Office"; int i;
for (i=0;i<strlen(a)/2;i++)
{ c=*a; strcpy(a,a+1);
a[strlen(a)]=c;
puts(a);
}
getch();
}
fficeO
ficeOf
iceOff
练 习
程序阅读题
# include<string.h>
void main()
{ char a[5][20]={"abc", "def", "123", "456", "#$%"};
int i, j;
for(i=0; i<4; i++)
{ j=0;
while(a[i][j]) j++;
strcat(*(a+i)+j,*(a+i+1));
}
for(i=0; i<4; i++) puts(*(a+i));
}
输出结果:
abcdef
def123
123456
456#$%
练 习
$$