当前位置:文档之家› 第7讲 返回指针值的函数-指针数组-指向指针的指针

第7讲 返回指针值的函数-指针数组-指向指针的指针


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; 对 ;
方法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]); }
第7讲 指针
内容: 内容: (1)返回指针值的函数 (1)返回指针值的函数 (2)指针数组 (2)指针数组 (3)指向指针的指针 (3)指向指针的指针
返回指针值的函数
函数的返回值可以是一个指针类型的数据(即地址) 函数的返回值可以是一个指针类型的数据(即地址) 返回指针值函数的定义格式: 返回指针值函数的定义格式: 函数类型 * 函数名( 形参列表 ) 函数名( 函数体; { 函数体; }
&x &y a
x y 数组a 数组 a[0] a[1] a[2] a[3]
指针数组
指针数组用得最多的是“字符型指针数组” 指针数组用得最多的是“字符型指针数组”,利用字符指针数 组可以指向多个长度不等的字符串,使字符串处理起来更方便、 组可以指向多个长度不等的字符串,使字符串处理起来更方便、 灵活,节省内存空间。 灵活,节省内存空间。 char *p[4]; 定义一个4个元素的字符指针数组 其 定义一个 个元素的字符指针数组p,其 个元素的字符指针数组 中每个数组元素是一个字符指针,可以 中每个数组元素是一个字符指针 可以 指向一个字符串
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 \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]); //输出排序后的书名 输出排序后的书名 }
说明: 说明:定义一个返回指针值的函数与定义普通函数的格式基本 类似, 类似,只是在函数名前加 * , 表明该函数返回一个指针值
例: int * fun ( int a , int b ) { 函数体 ; }
返回指针值的函数
求某班成绩的平均分, 例3-4求某班成绩的平均分 最高分和最低分 求某班成绩的平均分 要求用返回指针值的函数实现 分析: 分析 main 通过函数average的返回值 通过函数 的返回值 &aver1 得到保存平均分变量的地址, 得到保存平均分变量的地址 p 进而得到平均分, 进而得到平均分 函数中将 平均分变量定义成静态的, 平均分变量定义成静态的 这样函数结束后该变量仍然 存在。 存在。 average 81 aver1静态 静态
返回指针值的函数
编写一个alloc(n)函数,用来在内存区开辟 函数, 例3-5: 编写一个 函数 n个字节的连续空间 该函数的返回值是一个指针 个字节的连续空间, 个字节的连续空间 该函数的返回值是一个指针, 指向新开辟的空间的起始地址 提示: 提示:先在内存申请一个相当大的连续空 p 个字节), 间(如1000个字节 然后在此区域内进行开 如 个字节 辟空间的操作。 辟空间的操作。 假设指针变量p原来指向未用空间的开 假设指针变量 原来指向未用空间的开 调用alloc(n)函数后 开辟了 个字节供 函数后, 头, 调用 函数后 开辟了n个字节供 程序使用, 而指针变量p的值应变成 的值应变成p+n, 同 程序使用 而指针变量 的值应变成 时将新的p值返回 值返回, 时将新的 值返回 表示可以利用从此位置 开始的存储单元。 开始的存储单元。 如果要开辟的空间太大, 如果要开辟的空间太大 超过了预设的 空间, 函数应返回空指针NULL, 空间 则alloc(n)函数应返回空指针 函数应返回空指针 表示开辟失败。 表示开辟失败。
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;
定义格式: 数组名[数组长度 定义格式: 类型名 *数组名 数组长度 ; 数组名 数组长度]; 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]
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]); }
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] }
相关主题