实验十:指针与函数
- 格式:doc
- 大小:86.00 KB
- 文档页数:3
C语⾔中的函数指针与指针函数函数是任何⼀门语⾔中必不可少的部分,正是由这些函数组成了程序。
⾸先谈⼀下C语⾔中的函数指针与指针函数,再了解⼀下函数参数传递的相关原理。
1.函数指针与指针函数(1) 函数指针即指向这个函数的指针,定义为数据类型 (*fun)(参数列表) ,()的优先级⽐*⾼,所以*fun加括号。
如 void (*fun)(int*,int*);(2)指针函数即返回值是指针的函数,定义为数据类型 * fun(参数列表). 如 char* fun(int*,int*);即返回值为char*型。
在C语⾔中,变量有它的地址,同理函数也是有地址的。
那么把函数的地址赋给函数指针,再通过函数指针调⽤这个函数就可以了。
第⼀步: 定义函数指针,如 int (*pfun)(int*,int*);第⼆步: 定义函数如 int fun(int*,int*);第三步: 把函数的地址赋给函数指针,即 pfun=fun;第四步: 通过函数指针去调⽤这个函数 (*pfun)(p,q); //pfun是函数的地址,那么 *pfun当然就是函数本⾝了。
2.函数参数传递问题在C语⾔中,有两种参数传递的⽅式,⼀种是值传递,另⼀种是指针传递。
值传递很好理解,即把实参的值传递给形参。
⽽指针传递传的是地址在C语⾔中,形参值的改变并不能改变实参的值,但形参所指向内容值的改变却能改变实参,这⼀点⾮常的重要,是指针传递的精华所在。
3. 指针函数当函数的返回值为指针类型时,应该尽量不要返回局部变量的指针,因为,局部变量是定义在函数内部,当这个函数调⽤结束了,局部变量的栈内存也被释放了,因此,不能够正确的得到返回值。
实际上,内存已经被释放了,但这个指针的地址已经返回过去了,但是这个地址已经是⽆效的了,此时,对这个指针的使⽤是很危险的。
4. 野指针野指针并不是NULL,⽽是指向垃圾内存的指针。
有两种情况可以导致野指针:(1) char* p;(2)malloc,free第⼀种情况是定义指针,但没有给指针赋地址,此时,对指针的使⽤是很危险的,因为你不知道它指向哪⾥,是个野指针。
指针函数与函数指针的区别在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义:1、指针函数是指返回参数为指针的函数,即本质是一个函数,函数返回类型是指针类型。
类型标识符*函数名(参数表)如:int *f(x,y);首先它是一个函数,只不过这个函数的返回值是一个地址值。
函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
表示:float *fun(); //声明指针函数float *p; //定义指针变量p = fun(a); //将指针函数的返回值赋给指针变量示例:int * GetDate(int wk,int dy);main(){int wk,dy;do{printf(Enter week(1-5)day(1-7)\n);scanf(%d%d,&wk,&dy);}while(wk<1||wk>5||dy<1||dy>7);printf(%d\n,*GetDate(wk,dy));}int * GetDate(int wk,int dy){static int calendar[5][7]={{1,2,3,4,5,6,7},{8,9,10,11,12,13,14},{15,16,17,18,19,20,21},{22,23,24,25,26,27,28},{29,30,31,-1}};return &calendar[wk-1][dy-1];}程序应该是很好理解的,子函数返回的是数组某元素的地址。
输出的是这个地址里的值。
注意指针函数与函数指针表示方法的不同,千万不要混淆。
最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
2、函数指针是指向函数的指针变量,即本质是一个指针变量。
实验10指针做函数参数编程训练实验目的:1.掌握指针的定义及使用;2.体会使用指针的作用;3.掌握指针做函数参数的作用;4.掌握指针做函数参数的基本步骤;实验题目:1.输入某年某月某日,计算并输出它是这一年的第几天。
/*函数功能:对给定的某年某月某日,计算它是这一年第几天函数参数:整型变量year,month,day,分别代表年,月,日函数返回值:这一年的第几天*/int DayofYear(int year,int month,int day);2.输入某一年的第几天,计算并输出它是这一年的第几月第几日。
/*函数功能:对给定的某一年的第几天,计算它是这一年的第几月第几日函数入口参数:整型变量year,存储年整型变量yearDay,存储这一年的第几天函数出口参数:整型指针pMonth,指向存储这一年第几月的整型变量整型指针pDay,指向存储第几日的整型变量函数返回值:无*/void MonthDay(int year,int yearDay,int *pMonth,int *pDay);3.输出如下菜单,用switch语句实现根据用户输入的选择执行相应的操作。
1.year/month/day->yearDay2.yearDay->year/month/day3.ExitPlease enter your choice:参考程序及注释:#include <stdio.h>#include <stdlib.h>int DayofYear(int year, int month, int day);void MonthDay(int year, int yearDay, int *pMonth, int *pDay);void Menu(void);int dayTab[2][13] = {{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}};int main(){int year, month, day, yearDay;char c;Menu(); /* 调用Menu函数显示一个固定式菜单 */c = getchar(); /* 输入选择 */switch (c) /* 判断选择的是何种操作 */{case '1':printf("Please enter year, month, day:");scanf("%d,%d,%d", &year, &month, &day);yearDay = DayofYear(year, month, day);printf("yearDay = %d\n", yearDay);break;case '2':printf("Please enter year, yearDay:");scanf("%d,%d", &year, &yearDay);MonthDay(year, yearDay, &month, &day);printf("month = %d, day = %d\n", month, day);break;case '3':exit(0); /* 退出程序的运行 */default:printf("Input error!");}return 0;}/* 函数功能:对给定的某年某月某日,计算并返回它是这一年的第几天 */int DayofYear(int year, int month, int day){int i, leap;/* 若year为闰年,即leap值为1,则用第1行元素dayTab[1][i]计算;否则leap值为0,用第0行dayTab[0][i]计算 */leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);for (i=1; i<month; i++){day = day + dayTab[leap][i];}return day; /* 返回计算出的day的值 */}/* 函数功能:对给定的某一年的第几天,计算它是这一年的第几月第几日 */ void MonthDay(int year, int yearDay, int *pMonth, int *pDay){int i, leap;leap = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);for (i=1; yearDay>dayTab[leap][i]; i++){yearDay = yearDay - dayTab[leap][i];}*pMonth = i; /* 将计算出的月份值赋值给pMonth所指向的变量 */ *pDay = yearDay; /* 将计算出的日号赋值给pDay所指向的变量 */}/* 函数功能:显示菜单 */void Menu(void){printf("1. year/month/day -> yearDay\n");printf("2. yearDay -> year/month/day\n");printf("3. Exit\n");printf("Please enter your choice:");}实验11 字符串与指针编程练习实验目的:1.熟悉字符串的输入及输出2.掌握字符指针做函数参数的方法3.掌握数组做函数参数的方法实验题目:1.编写一函数实现字符串的反序输出,函数原型如下:void invert(char *s);即将字符串s反序。
指针函数和函数指针有什么区别1,这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。
我们知道函数都又返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
其定义格式如下所示:返回类型标识符*返回名称(形式参数表){ 函数体}返回类型可以是任何基本类型和复合类型。
返回指针的函数的用途十分广泛。
事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。
比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。
例如下面一个返回指针函数的例子:#includefloat *find();main(){static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}};float *p;int i,m;printf("Enter the number to be found:");scanf("%d",&m);printf("the score of NO.%d are:\n",m);p=find(score,m);for(i=0;i<4;i++)printf("%5.2f\t",*(p+i));}float *find(float(*pionter)[4],int n)/*定义指针函数*/{float *pt;pt=*(pionter+n);return(pt);}学生学号从0号算起,函数find()被定义为指针函数,起形参pointer是指针指向包含4个元素的一维数组的指针变量。
pointer+1指向score的第一行。
*(pointer+1)指向第一行的第0个元素。
pt是一个指针变量,它指向浮点型变量。
main()函数中调用find()函数,将score数组的首地址传给pointer.2,“函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。
函数和指针程序设计实验总结与反思通过函数和指针程序设计实验还是反映出比较多的问题,我感觉第八章的指针比较难理解,与前面数组部分联系起来了,上理论课时有一些地方不太明白。
通过此次老师重点讲解函数和指针程序设计实验,加深了我对字符指针和指针数组的掌握,理解会好很多,思路也更清晰很多,但还是要多去理解,也有些东西需要去记忆。
比如一个字符串在内存中是连续存储的,它的开始地址为指向字符串的指针值。
当使用指针作为形参时,实参必须是地址,也应是数组名。
一开始写完这个程序的时候运行出来的输出结果数字与数字之间没有间隔,就是一长串的数字,但是顺序是对的,通过对代码的再次检查,在输出后面加上空格,就得到了正确的格式,这种小问题发现比较难,在打代码的时候就要留心。
我从函数和指针程序设计实验中学习到很多。
我们写代码的时候一定要仔细,定义的函数与调用时的要一致,不要犯一些低级的错误。
总之还是要多去理解代码,多从错误中学习。
《程序设计基础(C语言)》目录第1 章概述 (1)1.1 课程简介 (1)1.2 实验环境选择 (1)第 2 章实验要求 (1)2.1 实验过程要求 (1)2.2 考核及评分标准 (1)第 3 章实验内容 (2)3.1 实验1 熟悉C语言运行环境 (2)3.2 实验2 数据类型 (3)3.3 实验3 运算符和表达式 (4)3.4 实验4 顺序结构及输入和输出 (6)3.5 实验5 选择结构 (7)3.6 实验6 循环结构 (9)3.7 实验7 数组(1) (11)3.8 实验8 数组(2) (12)3.9 实验9 字符串及其操作 (13)3.10 实验10 函数 (14)3.11 实验11 结构体 (15)3.12 实验12 指针 (16)第 1 章概述1.1 课程简介《程序设计基础(C语言)》是软件工程各专业或其它相近专业学生的公共职业基础课,是软件类各专业的入门课程,直接影响学生后继职业技术课程的学习及可持续发展能力的培养。
通过本书,学习基本的程序设计概念和程序设计方法,学会使用C语言解决实际问题,进行初级的程序设计。
1.2 实验环境选择VC++6.0第 2 章实验要求2.1 实验过程要求本课程中,实验者必须服从指导教师和实验室工作人员的安排,遵守纪律与实验制度,爱护设备及卫生。
在指定的实验时间内,必须到机房内实验,其余时间可自行设计和分析。
本课程所涉及的程序代码,都要求有较高的可读性和效率,多文件表示。
2.2 考核及评分标准若实验者在指定上机时间三次不到课,取消考核资格。
请假,必须提前出具正式假条,不接受事后假条。
如果发现抄袭、篡改、伪造实验数据,或实验报告和设计报告雷同,涉及的所有学生的该课程成绩计为0 分。
本课程采用结构化评分,主要由指导教师灵活处理,可以是考勤等。
第 3 章实验内容3.1 实验1 熟悉C语言运行环境一、实验目的1.了解什么是C语言2.熟悉C语言程序开发环境二、实验内容和步骤1.大学生涯的第一个程序1)运行Microsoft Visual Studio 2008或者VC6.02)创建项目,选择win32控制台应用程序或者空项目,项目名为MyFirstApp3)新建项目,选择C++源文件,文件名为HelloWorld4)在程序编辑窗口,输入如下代码#include <stdio.h>/* 主程序*/void main(){printf("hello world\n");}5)执行程序,Ctrl+F56)观察输出结果,并记录2.修改程序1)增加语句,观察输出结果是否不同printf("hello world\n");printf("world is me\n");2)删除输出字符串中的“\n”,观察输出结果是否不同printf("hello world\n");3)进行换行输出,观察输出结果是否不同printf("hello, ");printf("world");printf("\n");4)将上个程序块中的printf("\n");去掉,观察输出结果是否不同3.用自己的语言,描述下对C语言程序的第一印象4.简单描述下,第二步骤中,输出结果相同与不同的原因;以及“\n”的用途3.2 实验2 数据类型一、实验目的1.掌握变量的命名规则和定义2.掌握C语言程序中的各种数据类型并使用它们二、实验内容和步骤1.定义3个变量numInt、numFloat、charInfo,他们的类型分别为整型,单精度类型,字符型;并分别初始化为2,2.0和‘A’,最后输出这三个变量的值。
函数、指针这两个词结合的顺序不同其意义也不同,即指针函数与函数指针的意义不同。
指针函数指针函数的本质是一个函数,其返回值是一个指针。
示例如下:int *pfun(int, int);由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。
即:int *(pfun(int, int));接着再和前面的“*”结合,说明这个函数的返回值是一个指针。
由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。
指针函数示例程序如下:#include <stdio.h>//这是一个指针函数的声明int *pfun(int *arr, int n);int main(void){int array[] = {0, 1, 2, 3, 4};int len = sizeof(array)/sizeof(array[0]);int *p;int i;//指针函数的调用p = pfun(array, len);for (i = 0; i < len; i++){printf("array[%d] = %d\n", i, *(p+i));}return 0;}//这是一个指针函数,其返回值为指向整形的指针int *pfun(int *arr, int n){int *p = arr;return p;}程序运行结果如下:主函数中,把一个数组的首地址与数组长度作为实参传入指针函数pfun里,把指针函数的返回值(即指向数组的指针)赋给整形指针p。
最后使用指针p来遍历数组元素并打印输出。
函数指针函数指针其本质是一个指针变量,该指针变量指向一个函数。
C程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。
函数指针示例:/*声明一个函数指针 */int (*fptr) (int, int);/* 函数指针指向函数func */fptr = func; // 或者fptr = &func;func是一个函数名,那么func与&func都表示的是函数的入口地址。
实验十:指针与函数
实验要求
1.掌握指针的定义与赋值
2.掌握函数地址值的传递方法
实验内容
1、定义两个指针变量,分别指向变量a,b两个整数,按先大后小的顺序输出a和b #include <stdio.h>
main()
{
int *p1,*p2,*p,a,b;
scanf("%d,%d",&a,&b);
p1=&a;p2=&b;
if(a<b)
{p=p1;p1=p2;p2=p;}
printf("max=%d,min=%d\n",*p1, *p2);
}
2、通过函数调用的方式,传递地址值,实现上题功能
#include <stdio.h>
int max(int *pa,int *pb)
{
int n;
if(*pa<*pb)
{
n=*pa;
*pa=*pb;
*pb=n;
return n;
}
}
void main()
{
int pa,pb;
int *n=&pa,*m=&pb;
printf("输入两个整数:\n");
scanf("%d%d",&pa,&pb);
max(n,m);
printf("max=%d,min=%d\n",pa,pb);
}
3、用指针法实现交换两个变量的值,并在主函数中调用
#include <stdio.h>
void swap(int *p1,int *p2)
{ int t;
t=*p1; *p1=*p2; *p2=t; //交换p1和p2所指向的内容}
void main()
{ int a,b;
int *p1, *p2;
printf("请输入两个数字:\n");
scanf("%d%d",&a,&b);
p1=&a; p2=&b;
swap(p1,p2); //函数调用,指针作为实参printf("\n%d,%d\n",a,b);
}。