内容正文:
第七章 程序的性能优化--指针
1
CONTENTS
目录
01
02
为什么使用指针
什么是指针
03
指针变量的应用
04
指针变量的运算
05
使用指针访问一维数组中的元素
CONTENTS
目录
06
07
字符型指针引用字符串
使用指针访问二维数组中的元素
08
指针数组与指针的指针
09
使用指针作为函数的参数
10
使用指针作为函数的返回值
11
使用指针调用函数
C语言
知识树
My First Template
使用指针作为函数的参数
C语言程序设计
5
C语言
本次任务
任意输入两个数通过函数调用完成交换两个数的值。
C语言程序设计—使用指针作为函数的参数
My First Template
C语言
任务分析
#include "stdio.h"
void main()
{
int x,y,temp;
printf("请输入x,y的值:
");
scanf("%d,%d",&x,&y);
printf("x=%d,\ty=%d
",x,y);
temp=x;
x=y;
y=temp;
printf("交换后x=%d,\ty=%d
",x,y);
}
基本实现
C语言程序设计—使用指针作为函数的参数
My First Template
交换任务
输入两
个数
交换
大小
函数
C语言
任务初探
#include "stdio.h"
swap(int a,int b);
void main()
{
int x,y,temp;
printf("请输入x,y的值:
");
scanf("%d,%d",&x,&y);
printf("交换前:x=%d,\ty=%d
",x,y);
printf("swapped:
");
swap(x,y);
printf("交换后:x=%d,\ty=%d
",x,y);
}
swap(int a,int b)
{ int temp;
temp=a; a=b; b=temp;
}
C语言程序设计—使用指针作为函数的参数
My First Template
C语言
参数传递方式
1、值传递方式
方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值
特点:形参与实参占用不同的内存单元,单向传递。
2、址传递方式
方式:函数调用时,将数据的存储地址作为参数传递给形参
特点:形参与实参占用同样的存储单元;“双向”传递;实参和形参必须是地址常量或变量
C语言程序设计—使用指针作为函数的参数
My First Template
C语言
指针变量存储地址
EF3D
C语言中取一个变量的地址用“&” 符号。如:int a ; &a表示取a的地址
存储地址,使用指针(数据类型)变量。格式: int *p; int * 代表指针类型,p为变量名。
内存
10
int x
ED53
地址
变量
数据
ED53
int *p
指针
在指针定义(int *p)后:
p表示地址
*p表示取地址里面的值。
C语言程序设计—使用指针作为函数的参数
My First Template
C语言
任务再分析
#include "stdio.h"
swap(int a,int b);
void main()
{
int x,y;
printf("请输入x,y的值:
");
scanf("%d,%d",&x,&y);
printf("交换前:x=%d,\ty=%d
",x,y);
printf("swapped:
");
swap(x,y);
printf("交换后:x=%d,\ty=%d
",x,y);
}
swap(int a,int b)
{ int temp;
temp=a; a=b; b=temp;
}
7
11
x:
y:
调用前:
调用结束:
7
11
x:
y:
调用:
7
11
a:
b:
7
11
x:
y:
swap:
7
11
x:
y:
11
7
a:
b:
temp
值传递
C语言程序设计—使用指针作为函数的参数
My First Template
C语言
任务实现
#include "stdio.h"
swap(int *a,int *b);
void main()
{
int x,y;
printf("请输入x,y的值:
");
scanf("%d,%d",&x,&y);
printf("交换前:x=%d,\ty=%d
",x,y);
printf("swapped:
");
swap(&x,&y);
printf("交换后:x=%d,\ty=%d
",x,y);
}
swap(int *a,int *b)
{ int temp;
temp=*a; *a=*b; *b=temp;
}
7
11
x:
y:
调用前:
调用结束:
11
7
x:
y:
调用:
7
11
a:
b:
7
11
x:
y:
swap:
x:
y:
11
7
a:
b:
temp
C语言程序设计—使用指针作为函数的参数
My First Template
使用指针作为函数的返回值
C语言程序设计
13
C语言
本次任务
输入一个学生的学号,输出他的名字。
C语言程序设计—使用指针作为函数的返回值
My First Template
C语言
函数的返回值
C语言程序设计—使用指针作为函数的返回值
一个函数可以带回返回值,返回值的类型既可以是整型、字符型、实型等类型,也可以返回指针,即数据的地址。返回值为指针数据的函数也被简称为指针函数。
指针函数的定义的语法是:
类型名 *函数名(参数列表);
例 如:
int *fun(int x);
说 明:这句声明的含义是声明了一个名为fun的函数,x是fun函数的整型形参,这个函数调用后可以得到一个指向整型数据的指针。函数名前的“*”,就表示此函数是指针函数。
My First Template
C语言
任务实现
C语言程序设计—使用指针作为函数的返回值
#include "stdio.h"
char *result_name(char *stu_name[],int stu_num)
{ //返回指针数组stu_name的第stu_num个元素,即指向学生名字字符串首字符的指针
return *(stu_name+stu_num-1) ;
}
void main() //主函数
{
char *name[]={"Tom","Jerry","Tuffy","Speike","John","Julies","Joshua","Monica"};
int num;
printf("请输入学生的学号:");
scanf("%d",&num);
printf("%s",result_name(name,num));
}
My First Template
C语言
任务分析与总结
C语言程序设计—使用指针作为函数的返回值
#include "stdio.h"
char *result_name(char *stu_name[],int stu_num)
{ //返回指针数组stu_name的第stu_num个元素,即指向学生名字字符串首字符的指针
return *(stu_name+stu_num-1) ;
}
void main() //主函数
{
char *name[]={"Tom","Jerry","Tuffy","Speike","John","Julies","Joshua","Monica"};
int num;
printf("请输入学生的学号:");
scanf("%d",&num);
printf("%s",result_name(name,num));
}
说 明1:主函数开始定义了一个指向字符型数据的指针数组,也就是说,数组中的每一个元素都是一个指向字符型数据的指针,每一个指针元素都可以指向一个字符串的首字符地址。name[0]等价于*name,指向的是第一个学生名字字符串“Tom”的首地址;name[1]等价于*(name+1),指向的是第二个学生名字字符串“Jerry”的首地址。
My First Template
C语言
任务分析与总结
C语言程序设计—使用指针作为函数的返回值
想要输出第num号学生的姓名,只需要拿到第num号学生名字字符串的首地址,只需要拿到*(name+num-1)的值即可。
说 明2:自定义函数result_name返回一个指向字符数据指针数组stu_name的第stu_num号元素,也就是说,返回值是一个字符指针。
My First Template
C语言
任务分析与总结
C语言程序设计—使用指针作为函数的返回值
#include "stdio.h"
char *result_name(char *stu_name[],int stu_num)
{ //返回指针数组stu_name的第stu_num个元素,即指向学生名字字符串首字符的指针
return *(stu_name+stu_num-1) ;
}
void main() //主函数
{
char *name[]={"Tom","Jerry","Tuffy","Speike","John","Julies","Joshua","Monica"};
int num;
printf("请输入学生的学号:");
scanf("%d",&num);
printf("%s",result_name(name,num));
}
说 明3:result_name函数的第一个形参stu_name,用数组名做函数的参数,事实上C语言编译的时候,都是将形参数组名当做指针变量来处理的。实参数组名name代表的是该数组首元素的地址,也就是第一个字符指针的地址。而形参stu_name是用来接收从实参传递过来的数组首元素的地址,因此stu_name实际上是一个指针变量,指向实参name的的第一个字符指针,因此它是指向指针的指针。自定义函数result_name的首部也可以写为:
char *result_name(char **stu_name,int stu_num)
My First Template
使用指针调用函数
C语言程序设计
20
C语言
本次任务
输入三个数,计算三个数中的最大值。
C语言程序设计—使用指针调用函数
My First Template
C语言
函数指针
一个函数在程序编译的时候会被分配一段存储空间,函数名代表空间的起始地址,被称为该函数的指针。我们也可以定义一个指针变量来指向函数,然后通过该指针变量来调用此函数,这种指针就叫做函数指针。
定义函数指针的语法是:
类型名 (*指针变量名)(函数参数表列);
例 如:
int (*p)(int,int);
说 明:声明了一个指向函数的指针p,函数的返回值类型为整型,带有两个整型的形参。也就是说,函数指针并不是随意指向任何一个函数,函数的类型必须与函数指针的定义相一致。与指针做函数返回值的函数声明有区别,因为优先级的关系,“*指针变量名”必须使用圆括号括起来。
C语言程序设计—使用指针调用函数
My First Template
C语言
任务实现
#include "stdio.h" //预处理
int max(int a,int b,int c) //定义max函数,找出a,b,c三者的最大值
{ int max_int=a;
if(max_int<b) max_int=b;
if(max_int<c) max_int=c;
return max_int;
}
void main() //主函数
{ int x,y,z;
int (*p)(int,int,int); //声明一个指向函数的指针
p=max; //将指针p指向函数max
printf("请输入三个整数:");
scanf("%d%d%d",&x,&y,&z);
printf("三个数中最大的是:%d
",(*p)(x,y,z)) ; //通过*p调用max函数
}
C语言程序设计—使用指针调用函数
My First Template
C语言
任务分析与总结
#include "stdio.h" //预处理
int max(int a,int b,int c) //定义max函数,找出a,b,c三者的最大值
{ int max_int=a;
if(max_int<b) max_int=b;
if(max_int<c) max_int=c;
return max_int;
}
void main() //主函数
{ int x,y,z;
int (*p)(int,int,int); //声明一个指向函数的指针
p=max; //将指针p指向函数max
printf("请输入三个整数:");
scanf("%d%d%d",&x,&y,&z);
printf("三个数中最大的是:%d
",(*p)(x,y,z)) ; //通过*p调用max函数
}
C语言程序设计—使用指针调用函数
说 明1:将一个函数指针指向一个函数,只需要将函数名赋值给该指针,不需要传递参数。
说 明2:使用函数指针调用函数时,只需使用(*p)代替函数名即可,如果函数带有参数,则必须携带实参才可以调用。
说 明3:指向函数的指针,是不可以进行加减等运算的,因为没有意义。
My First Template
C语言
本次任务
输入10个整数。接下来由用户选择输入0或者1。如果输入0,则将这组数字逆序输出;如果用户输入1,则正序输出
C语言程序设计—使用指针调用函数
My First Template
C语言
任务实现
C语言程序设计—使用指针调用函数
#include "stdio.h"
void sort_po(int *a)
//10元素数组正排序函数
{
int temp,*i,*j;
for(i=a;i<a+10-1;i++)
for(j=i+1;j<a+10;j++)
{
if(*i>*j)
{
temp=*i;
*i=*j;
*j=temp;
}
}
}
void sort_in(int *a)
//10元素数组逆排序函数
{
int temp,*i,*j;
for(i=a;i<a+10-1;i++)
for(j=i+1;j<a+10;j++)
{
if(*i<*j)
{ temp=*i; *i=*j; *j=temp;
}
}
}
void main() //主函数
{
int x[10];
int i,m;
void (*p)(int *);
printf("请输入10个整数:
");
for(i=0;i<10;i++) //数组初始化
scanf("%d",&x[i]);
printf("请选择输出方式,0为逆序,1为正序:
");
scanf("%d",&m);
if(m==0) p=sort_in;
if(m==1) p=sort_po; (*p)(x);
//调用p指向的函数,携带整型指针实参x
for(i=0;i<10;i++) printf("%d ",x[i]);
}
My First Template
C语言
任务实现
C语言程序设计—使用指针调用函数
输入“1 3 5 7 9 2 4 6 8 10”,选择0。
输入“1 3 5 7 9 2 4 6 8 10”,选择1
My First Template
$$