10.3 二级指针(课件)-《 C语言程序设计》同步教学(电子工业出版社)

2024-08-11
| 16页
| 35人阅读
| 6人下载
普通

内容正文:

第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#$% 练 习 $$

资源预览图

10.3  二级指针(课件)-《 C语言程序设计》同步教学(电子工业出版社)
1
10.3  二级指针(课件)-《 C语言程序设计》同步教学(电子工业出版社)
2
10.3  二级指针(课件)-《 C语言程序设计》同步教学(电子工业出版社)
3
10.3  二级指针(课件)-《 C语言程序设计》同步教学(电子工业出版社)
4
10.3  二级指针(课件)-《 C语言程序设计》同步教学(电子工业出版社)
5
10.3  二级指针(课件)-《 C语言程序设计》同步教学(电子工业出版社)
6
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。