当前位置:   article > 正文

C语言_指向函数的指针

指向函数的指针

1.函数指针定义:

         如果在程序中定义一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针

  1. 类型名 (指针变量名)(函数参数列表);
  2. int (*p)(int,int);

(1)定义指向函数指针变量,并不意味着这个指针变量可以指向任何函数,他只能指向在定义时指定的类型函数

(2)如果要用指针变量调用函数,必须先使用指针变量指向该函数

p=max            //这就是把函数入口地址赋给指针变量p

(3)在给函数指针变量赋值时,只需给出函数名不必给出参数

(4)用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量),在(*p)之后的括号中根据需要写上实参

c=(*p)(a,b);

(5)对指向的函数的指针变量不能进行算术运算

(6)用函数名调用函数,只能调用所指定的一个函数,而通过指针变量调用函数比较灵活,可以根据不同情况调用不同的函数

2.用指针变量调用函数

调用函数可以通过

     (1)通过函数名调用

  1. int max(int x,int y);
  2. int a,b,c;
  3. c=max(a,b);

     (2)通过指针变量访问它所指的函数 

  1. int max(int x,int y);
  2. int (*p)(int,int);
  3. int a,b,c;
  4. p=max;
  5. c=(*p)(a,b);

3.用指向函数的指针作函数参数

指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数

  1. void fun(int(*x1)(int),int(*x2)(int,int))
  2. {
  3. int a,b,i=3,j=5;
  4. a=(*x1)(i);
  5. b=(*x2)(i,j);
  6. }

4.返回指针值的函数

  1. 类型名 * 函数名(参数表列);
  2. float * search(float(* pointer)[4],int n);

5.指针数组

定义:一个数组,若其元素都为指针类型数据被称为指针数组

[]比*优先级高所以p先于[]结合

  1. 类型名 * 数组名[数组长度]
  2. int *p[4]

6.指向指针数据的指针

char **p;

7.指针数组作main函数的形参

指针数组的一个重要应用时作为main函数的形参

  1. int main()
  2. int main(void) //括号中是空的或有"void",表示main函数没有参数,调用main函数时不必给出实参
  3. // 在某些情况下可以带有参数
  4. int main(int arge,char * argv[])
  5. // argc和argv就是main函数形参,他们是程序的"命令行参数"。
  6. // argc(argument count 的缩写,意思是参数个数),argv(argument vector意思是参数向量),
  7. // 它是一个 *char指针数组,数组中每个元素(其值为指针)指向命令行中的一个字符串

8.动态内存分配与指向它的指针变量

全局变量是分配在内存中静态存储区域,非静态的局部变量(包括形参)是分配宅内存中的动态存储区域,这个存储区是一个被称为栈(stack)的区域,除此之外C语言还允许建立内存动态分配区域,可以存放一些临时用的数据,这些数据不必再程序的声明部分定义,也不必等到函数结束再释放,而是随时开辟,不需要随时释放,这些数据临时存放再一个特别的自由存储区,称为堆(heap)区

2.怎样建立内存的动态分配

(1)使用 malloc函数

  1. void * malloc(unsigned int size);//作用:在内存动态区域中分配一个长度为size的连续空间,形参size的类型定义为无符号整型(不允许为负数)
  2. malloc(100) //开辟100字节的临时分配域,函数值为第一个字节地址

(2)使用calloc函数

  1. void * calloc(unsigned n,unsigned size); // 作用:在内存的动态存储区域开辟动态存储空间,n为
  2. // 数组元素个数,每个元素长度为size,这个空间较大,足以保存一个数组

(3)使用free函数

  1. void free(void *p ); //作用释放指针变量p所指向的动态空间,使这部分空间能够重新被其他变量使用,p应该使最近的一次调用calloc和malloc函数时得到的函数返回值
  2. free(p); //释放指针变量p所指的已分配的动态空间

(4)使用realloc函数

  1. void * realloc(void * p,unsigned int size); // 作用使用malloc函数或者calloc函数获得动态区域,想改变其大小,可以用realloc函数重新分配。
  2. realloc(p,50) //将p所指向的已分配的动态空间改为50字节

3.void指针类型

C99允许使用为void的指针类型,可以定义基类型为void的指针变量(即void * 型变量),它不指向任何类型的数据,理解为为指向 “空类型”或者不确定的类型,在它的值赋给另一指针变量时由系统进行类型转换,使之适合于被赋值的变量的类型

  1. int a=3;
  2. int *p1=&a;
  3. char *p2;
  4. void *p3;
  5. p3=(void *)p1; //p1的值转换成void类型,然后赋值给p3
  6. p2=(char *)p3; //p3的值转换为char类型,然后赋值给p2
  7. print("%d",p1); //合法输出a的值
  8. p3=&a;
  9. printf("%d",p3); //错误,p3是无指向的,不能指向a

内存动态分配主要应用于建立程序中的动态数据结构

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/573815
推荐阅读
相关标签
  

闽ICP备14008679号