指向函数的指针与指向指针的指针
1、指向函数的指针
可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数中的入口地址就称为函数的指针。
例:比较a和b的大小,求大值。
#include<stdio.h> #include "StdAfx.h" int max(int x,int y) { int z; if(x>y) { z=x; } else { z=y; } return z; } void main() { int max(int,int); int (*p)(int,int); int a,b,c; p = max; scanf("%d%d",&a,&b); c=(*p)(a,b); printf("a=%d,b=%d,max=%d",a,b,c); }
用指向函数的指针作函数参数
函数指针变量常用的用途之一是指针作为参数传递到其他函数,以实现函数地址的传递,这样就能在被调用的函数中使用实参函数。
例:
#include<stdio.h> #include "StdAfx.h" void sub(int(*x1)(int),int(*x2)(int,int))/**x1与*x2分别为两个函数f1,f2的地址*/ { int a,b,i,j; a=(*x1)(i); /*调用f1函数*/ b=(*x2)(i,j);/*调用f2函数*/ …… }
返回指针值的函数
一般形式为*函数名 (参数表列);
例:有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号后,能输出该学生的全部成绩,用指针函数实现。
#include<stdio.h> #include "StdAfx.h" void main() { double score[][4]={{65,45,12,78},{45,45,88,65},{65,78,98,46},{78,45,96,93}}; double *search(double(*pointer)[4],int n); double *p; int i,n; scanf("%d",&n); printf("The scores of No.%d are:\n",n); p=search(score,n); for(i=0;i<4;i++) { printf("%5f\t",*(p+i)); } printf("\n"); } double *search(double(*pointer)[4],int n) { double *pt; pt=*(pointer+n); return pt; }
指针函数与函数指针的区别:
指针函数时指带指针的函数,即本质是一个函数。
函数指针是指函数的指针变量,因而函数指针本身首先应是指针变量,该指针变量指向函数。
指针数组和指向指针的指针
指针数组:一个数组,若元素均为指针类型数据,称为指针数组。
一维指针数组定义形式:类型名 *数组名[数组长度];
例:int *name[4];
例:
#include<stdio.h> #include "StdAfx.h" void main() { int a[5]={1,2,3,4,5}; int *name[5]={&a[0],&a[1],&a[2],&a[3],&a[4]}; int i; for(i=0;i<5;i++) { printf("%d",*name[i]); } }
指向指针的指针
形式:char **p;
说明:p前面有两个‘*‘号,*运算符的结合性是从右到左,因此**p相当于*(*p),显然*p是指针变量的定义形式。
例:
#include<stdio.h> #include "StdAfx.h" void main() { char *name[]={"I love China","NIT","I love you"}; char **p; int i; for(i=0;i<3;i++) { p=name+i; printf("%s\n",*p); } }