第10章 指针的高级应用
C语言程序设计
——进阶篇
• 二维数组是基类型为一维数组的指针 –可以使用与二维数组同类型的指针变量
• 使用指向行的指针访问二维数组元素
int a[M][N];
int (*p)[N]=a; /* p=a; */
则p[i]、*(p+i)、a[i]表示数组的第i行 且p[i][j]、*(*(p+i)+j)、*(p[i]+j)、 (*(p+i))[j]表示二维数组第i行j列的元素
——进阶篇
〘例10.5〙将字符串"China"、"India"、"Japan"、"America"、 "Canada"按字母顺序(由小到大)输出。
name[0] name[1] name[2] name[3] name[4] name[0] name[1] name[2] name[3] name[4] China India Japan America Canada China India Japan America Canada C语言程序设计
• 注意*(a+i)和*a+i的区别
C语言程序设计
——进阶篇
指向数组元素的指针变量 • 指向二维数组的元素 • 类型为 char *p; • 根据一维数组元素和二维数组元素的对应关 系,可以访问所有的二维数组元素 基类型为一维数组的指针变量
• 指向二维数组的行
• 类型为 char (*p)[4]; • 把每一行作为一个一维数组来处理
C语言程序设计
——进阶篇
char a[3][4];
a是一个长度为3的数组
数组元素是长度为4的数组
a a+1 a+2
a、a+1、a+2都是指针,它 们的基类型是长度为4的字 a[0] *a 符数组,它们与下面定义的 a[1] *(a+1) 指针p同类型 a[2] *(a+2)
char (*p)[4];
变量,简称函数指针。
C语言程序设计
——进阶篇
定义形式
类型 (*变量名)([参数类型列表]); 说明
• •
“类型”表示指针所指函数的返回值的类型; “(*指针变量名)”表示“*”后面定义的变量是指针变
量;
• • •
最后的括号表示指针变量所指的是一个函数, 参数类型列表列出函数参数的类型 指向函数的指针变量也称函数指针变量
——进阶篇
说明:
(1)与其他指针变量相同,指向函数的指针变量在使 用前也必须进行初始化操作,具体形式为“指针变量 =函数名”。不要写成“指针变量=函数名(形式参 数)”的形式。若带参数,它就不再是一个地址,而 是函数调用,返回的是整型数。例如, 指针赋值: f=area; 函数调用: s=area(m,n);
——进阶篇
〘例10.1〙编写指针型函数找出两个整型数中的最大值。
#include <stdio.h> int *max(int *x, int *y) { return (*x>*y?x:y); } void main() { int a,b,*p; scanf("%d, %d",&a,&b); p=max(&a,&b); printf("max=%d", *p); }
C语言程序设计
——进阶篇
例如: int (*pf)(); 表示pf是一个指向函数入口的指针变量,该函数的返 回值(函数值)是整型。 定义函数指针变量是为了方便对函数的调用。函 数指针变量不是固定指向哪一个函数的,在程序中,哪 个函数的地址赋予它,它就指向哪个函数。 用函数指针变量调用函数的一般形式为: (*指针变量名)(实参表) 或 C语言程序设计
——进阶篇
10.2
10.2.1
用指针访问二维数组
二维数组元素的地址
设: char a[3][4] = {{„1‟, „2‟,‟ 3‟,‟ 4‟}, { „5‟, „6‟,‟7‟,‟ 8‟}, {„9‟, ‟10‟, ‟11‟, ‟12‟}}; 它可以这样理解: 数组a有三个元素a[0]、a[1]、a[2] ; 每一个元素代表一行; 每行是一个包含4个元素的一维数组。
a[0][3] *(*a+3) a[1][3] *(*(a+1)+3) a[2][3] *(*(a+2)+3)
char *
a[1] a[2] a[2]+1 *(a+1) *(a+2) *(a+2)+1
C语言程序设计
——进阶篇
〘例10.4〙利用指针变量输出二维数组的值。
#include "stdio.h"
C语言程序设计
——进阶篇 char * 基类型为 char[4] 的指针 a a+1 a+2
*a a[0]
*a+1 *a+2 *a+3 a[0]+1 a[0]+2 a[0]+3
char
0,0 1,0 2,0
0,1a[0]0,2 1,1a[1]1,2 2,1a[2]2,2
0,3 1,3 2,3
a[1]+3 *(a+1)+3
void main() { int a[3][4]={1,3,6,9,7,12,24,17,11,31,25,30},i; int (*p)[4]=a; for(p=a;p<a+3;p++) { for(i=0;i<4;i++) printf("%3d",*(*p+i)); printf("\n"); } }
C语言程序设计
——进阶篇
10.2.4
指针数组
一个数组的元素值为指针则这个数组称为是指针数组。 指针数组的所有元素都必须是具有相同存储类型和指向相同 数据类型的指针变量。 指针数组的定义形式为 类型说明符 数组名[常量]; 其中类型说明符为指针所指向的变量的类型。 例如:int *p[3]; 表示p是一个指针数组,它有三个数组元素, 每个元素 值都是一个指针,指向整型变量。 注意与基类型为数组的指针区分 char (*p)[4]; C语言程序设计
/*返回最大数的指针*/
C语言程序设计
——进阶篇
10.1.2
指向函数的指针
函数代码是程序的算法指令部分,它们同样占据内存 空间,存放在代码(code)区。C语言规定,函数名就表
示该函数所占内存区域的首地址,或称该函数的入口地址,
将函数首地址赋给某一指针变量,则通过该指针变量就可 以调用这个函数。这种指向函数的指针变量称为函数指针
C语言程序设计
——进阶篇
指针p
数组a
a[i][j]的地址:p+in+j
C语言程序设计
〘例10.3〙用指针变量输出数组元素及直接用下标
——进阶篇
输出数组元素的比较。
#include <stdio.h> void main() { int a[3][4]={{1,3,6,9},{7,12,24,17},{11,31,25,30}}; int *p, i, j; for(i=0,p=&a[0][0];i<12;i++) printf("%4d",*p++); /* 指针表示法 */ putchar('\n'); for(i=0;i<3; i++) for(j=0;j<4;j++) printf("%4d",a[i][j]); /* 数组下标表示法 */ putchar('\n'); } C语言程序设计
C语言程序设计
——进阶篇
(2)函数的调用可以通过函数名调用,也可以通过函数指 针调用,只需将(*函数指针变量)代替函数名即可。
例如,
s=area(m,n);
相当于 s=(*f)(m,n);
l=length(m,n); 相当于“l=(*f)(m,n); (3)指向函数的指针变量可以先后指向不同的函数,但这 些函数的返回值类型应相同,且与函数指针定义中的类型 标识符相同。例如 f=area; 和 f=length; (4)函数指针变量不能进行算术运算,即函数指针的移动 是毫无意义的。 C语言程序设计
——进阶篇
C语言程序设计 —提高篇
第10章 指针的高级应用
C语言程序设计
——进阶篇
内容概述
指向多维数组的指针 指向函数的指针
返回指针值的函数
指针数组 指向指针的指针
C语言程序设计
——进阶篇
教学目标
复习数组的指针的含义,学习通过指针引用多维数组的 元素,了解指向数组的指针作为函数参数的传递过程 ; 了解函数指针的概念,正确地利用指针调用函数; 掌握返回指针的函数的定义和调用; 初步认识指向指针的指针,进而理解指针数组的应用;
——进阶篇 void main()
{
int m,n; float s,l; float (*f)(int,int); scanf("%d%d",&m,&n);
f=area; s=(*f)(m,n);
f=length; l=(*f)(m,n); length()*/ printf("area=%.2f,length=%.2f\n",s,l); } C语言程序设计
指针变量名(实参表)
——进阶篇
〘例10.2〙利用函数指针编程实现:输入三