第7讲 返回指针值的函数-指针数组-指向指针的指针
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2100 2107 2110 2116
i=0, j=1 i=0, j=2 i=0, j=3 P>B P≯V B≯J ≯ ≯ temp=p[0]; p[0]=p[2]; p[2]=temp;
i=2, j=3 V>P temp=p[2]; p[2]=p[3]; p[3]=temp;
指向指针的指针
2048 2026 2010 int x, *q,**t; 2026 36 2010 x=36; q x t q=&x; t=&q; t即为指向指针的指针 也称二级指针 即为指向指针的指针(也称二级指针 即为指向指针的指针 也称二级指针) 思考: 思考: q=45; 错,因为 是指针变量,赋值号右侧必须是地址 因为q是指针变量 因为 是指针变量, *q=45; 对 *t=56; 错,因为 是二级指针变量,*t等价于 因为t是二级指针变量 等价于q 因为 是二级指针变量, 等价于 **t=56; 对 ;
p1=alloc(10);
p1 buf p buf+10 buf+15 buf main p2 buf+10
p2=alloc(5);
1 2 : 9 \0 a : \0
char *alloc( int n) buf[0] { char *begin ; if (p+n <= buf+SIZE) { begin=p; buf[1] p=p+n; return(begin); : } : else return(NULL); buf[9] }
&aver1 aver
例3-4 程序代码 float *average(int n, float *max, float *min) { int i; float s, *aver, sum=0; void main( ) static float aver1; 静态局部变量 { int n; aver=&aver1; float x=0, y=100, *p; for(i=1; i<=n; i++) printf(“input n:”); { printf(“input s:"); scanf("%d",&n); scanf("%f", &s); p=average(n, &x, &y); if(s>*max) *max=s; printf("ave=%6.2f, ", *p); % if(s<*min) *min=s; printf("max=%6.2f, ", x); % sum=sum+s; printf("min=%6.2f\n", y); % } } aver1=sum/n; return(aver); }
定义格式: 数组名[数组长度 定义格式: 类型名 *数组名 数组长度 ; 数组名 数组长度]; int *p[3]; int x, y, a[4]; p[0]=&x; p[1]=&y; p[2]=a;
p是一个指针 是一个指针 是一 数组, 它有3 数组 它有 个元素, 个元素 每个 元素是一个 整型指针变 量, 可指向一 个整型数据 指针数组p 指针数组 p[0] p[1] p[2]
p[2] 2110 2107 2100 p[3] 2116 2100 2107 i=1, j=2 V>P temp=p[1]; p[1]=p[2]; p[2]=temp;
Pascal\0 VC\0 Basic\0 Java\0
i=1, j=3 P>J temp=p[1]; p[1]=p[3]; p[3]=temp;
&x &y a
x y 数组a 数组 a[0] a[1] a[2] a[3]
指针数组
指针数组用得最多的是“字符型指针数组” 指针数组用得最多的是“字符型指针数组”,利用字符指针数 组可以指向多个长度不等的字符串,使字符串处理起来更方便、 组可以指向多个长度不等的字符串,使字符串处理起来更方便、 灵活,节省内存空间。 灵活,节省内存空间。 char *p[4]; 定义一个4个元素的字符指针数组 其 定义一个 个元素的字符指针数组p,其 个元素的字符指针数组 中每个数组元素是一个字符指针,可以 中每个数组元素是一个字符指针 可以 指向一个字符串
第7讲 指针
内容: 内容: (1)返回指针值的函数 (1)返回指针值的函数 (2)指针数组 (2)指针数组 (3)指向指针的指针 (3)指向指针的指针
返回指针值的函数
函数的返回值可以是一个指针类型的数据(即地址) 函数的返回值可以是一个指针类型的数据(即地址) 返回指针值函数的定义格式: 返回指针值函数的定义格式: 函数类型 * 函数名( 形参列表 ) 函数名( 函数体; { 函数体; }
返回指针值的来自百度文库数
编写一个alloc(n)函数,用来在内存区开辟 函数, 例3-5: 编写一个 函数 n个字节的连续空间 该函数的返回值是一个指针 个字节的连续空间, 个字节的连续空间 该函数的返回值是一个指针, 指向新开辟的空间的起始地址 提示: 提示:先在内存申请一个相当大的连续空 p 个字节), 间(如1000个字节 然后在此区域内进行开 如 个字节 辟空间的操作。 辟空间的操作。 假设指针变量p原来指向未用空间的开 假设指针变量 原来指向未用空间的开 调用alloc(n)函数后 开辟了 个字节供 函数后, 头, 调用 函数后 开辟了n个字节供 程序使用, 而指针变量p的值应变成 的值应变成p+n, 同 程序使用 而指针变量 的值应变成 时将新的p值返回 值返回, 时将新的 值返回 表示可以利用从此位置 开始的存储单元。 开始的存储单元。 如果要开辟的空间太大, 如果要开辟的空间太大 超过了预设的 空间, 函数应返回空指针NULL, 空间 则alloc(n)函数应返回空指针 函数应返回空指针 表示开辟失败。 表示开辟失败。
p[0] p[1] p[2] p[3]
Pascal\0 VC\0 Basic\0 Java\0
指针数组
例2-4: 编程将书名按字母顺序排序后输出 方法1: 方法 用二维字符数组编程实现 思考: 思考: 二维字符数组定义成多大合适? ①二维字符数组定义成多大合适? ②采用什么方法进行排序? 采用什么方法进行排序? 字符串怎样比较和交换? ③字符串怎样比较和交换? ① 第一维的长度取决于有几本书 第二维的长度由最长的书名决定 ② 可使用冒泡排序或选择排序 ③ 字符串的比较和交换应使用相应 的字符串函数
buf[0] buf[1] : : buf[20]
: : buf[999]
返回指针值的函数
例3-5 程序代码 void main( ) #include <stdio.h> { char *p1,*p2 ; #include <string.h> p1=alloc(10); #define SIZE 1000 strcpy(p1,”123456789”); char buf[SIZE] ; 全局变量 p2=alloc(5); 输出地址 char *p=buf ; strcpy(p2,”abcd”); char *alloc( int n) { char *begin ; if ( p+n <= buf+SIZE ) { begin=p; p=p+n; return(begin); } else return(NULL); } printf(“buf=%p\n”, buf); printf(“p1=%p\n”, p1); printf(“p2=%p\n”, p2); puts(p1); puts(p2); for(int i=0 ; i<15 ; i++) printf(“%c”, buf[i]); }
方法2的过程演示 例2-4: 方法 的过程演示 for(i=0; i<N-1; i++) for(j=i+1; j<N; j++) if ( strcmp(p[i], p[j])>0) { temp=p[i]; p[i]=p[j]; p[j]=temp; }
temp 2100 2107
2110 p[0] 2100 2100 2116 p[1] 2107
P V B J B J P V
a C a a a a a C
s c a l \0 \0 s i c \0 v a \0
排序
s i c \0 v a \0 s c a l \0 \0
方法1: 例2-4:方法 用二维字符数组编程实现的程序代码 方法 #include<stdio.h> #include<string.h> 书名的最大长度+1 书名的最大长度 #define MAXLEN 7 //书名的最大长度 #define N 4 //书的数量 书的数量 void main( ) { int i, j; char temp[MAXLEN]; char name[N][MAXLEN]={"Pascal","VC","Basic","Java"}; printf("before sorted:\n"); 输出排序前的书名 for(i=0; i<N; i++) puts(name[i]); //输出排序前的书名 for(i=0; i<N-1; i++) 选择排序 for(j=i+1; j<N; j++) if (strcmp(name[i], name[j])>0) { strcpy(temp, name[i]); strcpy(name[i], name[j]); strcpy(name[j], temp); } printf("\nafter sorted:\n"); for(i=0; i<N; i++) puts(name[i]); //输出排序后的书名 输出排序后的书名 }
方法2: 例2-4: 方法 用指针数组编程实现
p[0] p[1] p[2] p[3]
Pascal\0 排序后 VC\0 Basic\0 Java\0
p[0] p[1] p[2] p[3]
Pascal\0 VC\0 Basic\0 Java\0
注意: 注意 排序时是交换指针变量的指向
方法2: 例2-4: 方法 用指针数组编程实现的程序代码 #include<stdio.h> #include<string.h> #define N 4 void main( ) { int i, j; char *temp=NULL; char *p[N]={"Pascal", "VC", "Basic", "Java"}; printf("\nBefore sorted:\n"); for(i=0; i<N; i++) puts(p[i]); for(i=0; i<N-1; i++) 交换的是字符串 for(j=i+1; j<N; j++) 的起始地址 if ( strcmp(p[i], p[j])>0) { temp=p[i]; p[i]=p[j]; p[j]=temp; } printf("\nAfter sorted:\n"); for(i=0; i<N; i++) puts(p[i]); }
buf[10] : buf[14] buf[15] : : buf[999]
begin buf+10 begin buf alloc alloc n n 5 10
指针数组
概念: 一个数组的元素均为指针类型的数据, 概念 一个数组的元素均为指针类型的数据, 则该数组称为指针数组 即:指针数组的每一个元素都是一个指针变量
说明: 说明:定义一个返回指针值的函数与定义普通函数的格式基本 类似, 类似,只是在函数名前加 * , 表明该函数返回一个指针值
例: int * fun ( int a , int b ) { 函数体 ; }
返回指针值的函数
求某班成绩的平均分, 例3-4求某班成绩的平均分 最高分和最低分 求某班成绩的平均分 要求用返回指针值的函数实现 分析: 分析 main 通过函数average的返回值 通过函数 的返回值 &aver1 得到保存平均分变量的地址, 得到保存平均分变量的地址 p 进而得到平均分, 进而得到平均分 函数中将 平均分变量定义成静态的, 平均分变量定义成静态的 这样函数结束后该变量仍然 存在。 存在。 average 81 aver1静态 静态