C++ 指针函数和函数指针有什么区别.doc_第1页
C++ 指针函数和函数指针有什么区别.doc_第2页
C++ 指针函数和函数指针有什么区别.doc_第3页
C++ 指针函数和函数指针有什么区别.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+ 指针函数和函数指针有什么区别这两个概念都是简称,指针函数是指带指针的函数,即本质是一个函数。我们知道函数都有返回类型(如果没有返回值,则为无值型),只不过指针函数返回类型是某一类型的指针(返回的是地址)。 返回类型标识符 *返回名称(形式参数表) 函数体 返回类型可以是任何基本类型和复合类型。 事实上每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。例如下面一个返回指针函数的例子(VC+ 编译通过):#include using namespace std; int main()float *find(float(*pionter)4,int n);static float score4=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;iy?x:y); void main()int (*ptr)(int,int);int a,b,c;ptr=max;cinab;c=(*ptr)(a,b);couta=a b=b c=cendl; ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数 。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有+和-运算,用时要小心。指针函数应用举例:建立链表,插入,删除接点#include using namespace std;#define NULL 0 struct studentlong num; float score; student *next; int n; int main() student *creat(void); student *del(student *,long); student *insert(student *,student *); void print(student *); student *head,*stu; long del_num; coutinput records:endl; head=creat(); /返回头指针 print(head); /输出全部结点 coutendldel_num; /输入要删除的学号 while(del_num!=0) head=del(head,del_num); /删除后链表的头地址 print(head); /输出全部结点 coutdel_num; coutendlstu-numstu-score; while(stu-num!=0) head=insert(head,stu); /返回地址 print(head); /输出全部结点 coutendlstu-numstu-score; return 0;student *creat(void) /建立链表的函数student *head; student *p1,*p2; n=0; p1=p2=new student; /开辟一个新单元,并使p1,p2指向它 cinp1-nump1-score; head=NULL; while(p1-num!=0)n=n+1; if(n=1) head=p1; else p2-next=p1; p2=p1; p1=new student; cinp1-nump1-score;p2-next=NULL;return(head); student *del(student *head,long num) /删除结点的函数student *p1,*p2; if (head=NULL) /是空表 coutlist null!num & p1-next!=NULL) /p1指向的不是所要找的结点且后面还有结点 p2=p1; p1=p1-next; /p1后移一个结点 if(num=p1-num) /找到了 if(p1=head) head=p1-next; /若p1指向的是首结点,把第二个结点地址赋予head else p2-next=p1-next; /否则将下一结点地址赋给前一结点地址 coutdelete:numendl; n=n-1; else coutcannot find next=NULL; /使p0指向的结点作为头结点 else while(p0-nump1-num) & (p1-next!=NULL) p2=p1; /使p2指向刚才p1指向的结点 p1=p1-next; /p1后移一个结点 if(p0-numnum) if(head=p1) head=p0; /插到原来第一个结点之前 else p2-next=p0; /插到p2指向的结点之后 p0-next=p1; else p1-next=p0; p0-next=NULL; /插到最后的结点之后 n=n+1; /结点数加 return (head); void print(student *head) /输出链表的函数 student *p; coutNow,These n records are:endl; p=head; if(head!=NULL) do coutnum scorenext;while(p!=NULL);int *pn 与int(*p)n区别int*pn-p是一个指针数组,它由n个指向整型数据的指针元素组成 (含有n个指针元素)int (*p)n- p是一个指针(数组指针),指向intn的数组(它指向一个由n个int元素构成的数组) #include using namespace std; int main() int *p4; int a=1,b=2,c=3,d=4; p0=&a; p1=&b; p2=&c; p3=&d; int (*pp)4; /pp0=&a;/error int aa4=5,6,7,8; pp=&aa; / 换成aa 是错误的,定义的pp元素个数要与aa相同才可以赋值 cout*(p0) *(pp0)endl; return 0; #include #include using namespace std;int main() int vInt=10; int arr2=10,20; int *p=&vInt; int *p2p=&p; int *parr2=&vInt,&vInt; int (*p2arr)2=&arr; coutDeclaration int vInt=10 type=typeid(vInt).name()endl; coutDeclaration arr2=10,20 type=typeid(arr).name()endl; coutDeclaration int *p=&vInt type=typeid(p).name()endl; coutDeclaration int *p2p=&p type=typeid(p2p).name()endl; coutDeclaration int *parr2=&vInt,&vInt type=typeid(parr).name()endl; coutDeclaration int (*p2arr)2=&arr type=typeid(p2arr).name()endl; return 0;运行的结果如下:(前面加了行号#XX)#01 Declaration int vInt=10 type=int#02 Declaration arr2=10,20 type=int *#03 Declaration int *p=&vInt type=int *#04 Declaration int *p2p=&p type=int * *#05 Declaration int *parr2=&vInt,&vInt type=int *#06 Declaration int (*p2arr)2=&arr type=int (*)2 #02, 在编译器看来数组只是相对应类型的指针类型。当把数组传递给函数作为参数的时候,传递的是指针,所以可以利用参数来修改数组元素。这个转化是编译器自动完成的。也就是说这里编译器自动完成了int类型到int *的转化,void f(int);int a2=10,20;f(a);/这行等价于编译器完成的函数转化f(int *p)#05:指针数组的编译器内部表示也是对应类型的指针。#06数组指针的编译器内部表示就是有一点特别了。编译器(或者说是语言本身)有数组指针这个内部表示。由于c+语言的类型严格检查的语言(当然还有一些是存在隐式类型转化的)所以我们下面的写法是不能编译通过的。int arr3=10,20;/注意是3个元素数组int (*p2arr)2=&arr;/注意是指向2个元素数组的指针小结 关于数组和指针的转化,以及我们使用指针(+,-)等来操作数组,是基于数组在内存中是连续分布的。看到这里就会明白下面的程序为什么会运行的了。我这里也把下面的程序作为今天内容的总结:#include using namespace std;int main() int a2=10,20; int *p=a;/根据上面说明,由于编译器的参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论