①函数指针

函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。

函数指针的声明方法为:
    函数类型 (标志符指针变量名) (形参列表);
    注1:“函数类型”说明函数的返回类型,“(标志符指针变量名 )”中的括号不能省,若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

下面的程序说明了函数指针调用函数的方法:

#include<stdio.h>
int max(int x,int y){ return(x>y?x:y); }
int main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}

ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。

②函数返回指针

void* f( )

③const指针

当使用带有const的指针时其实有两种意思。一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。

const指针,它的意思是指针本身的值是不能被修改的。它只有一种写法

int* const p=一个地址; (因为指针本身的值是不能被修改的所以它必须被初始化)

这种形式可以被理解为,p是一个指针,这个指针是指向int 的const指针。它指向的值是可以被改变的如*p=3;

④指向const指针

指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。

 const int* p; (推荐)int const* p;

第一种可以理解为,p是一个指针,它指向的内容是const int 类型。p本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的。
第二种很容易被理解成是p是一个指向int的const指针(指针本身不能被修改),但这样理解是错误的,它也是表示的是指向const的指针(指针指向的内容是不能被修改的),它跟第一种表达的是一个意思。为了避免混淆推荐大家用第一种。

⑤指向const的const指针

这个指针本身和它指向的内容都是不能被改变的。

 const int* const p=一个地址;int const* const p=一个地址;
#include <iostream>
using namespace std;int main(int argc, char *argv[])
{int a=3;int b;/*定义指向const的指针(指针指向的内容不能被修改)*/ const int* p1; int const* p2; /*定义const指针(由于指针本身的值不能改变所以必须得初始化)*/ int* const p3=&a; /*指针本身和它指向的内容都是不能被改变的所以也得初始化*/const int* const p4=&a;int const* const p5=&b; p1=p2=&a; //正确*p1=*p2=8; //不正确(指针指向的内容不能被修改)*p3=5; //正确p3=p1; //不正确(指针本身的值不能改变) p4=p5;//不正确 (指针本身和它指向的内容都是不能被改变) *p4=*p5=4; //不正确(指针本身和它指向的内容都是不能被改变) return 0;
}

函数指针、函数返回指针、const指针、指向const指针,指向const的const指针。相关推荐

  1. (转)函数指针,指针函数,指向函数的指针,返回指针的函数

    摘要: 在学习C语言时,一个比较容易混淆的概念就是函数指针.指针函数.返回值为指针的函数.本文将对这三个概念进行区分.指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同.函数指针就是一 ...

  2. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  3. 指向函数的指针 ------ 函数指针(function pointer)

    函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码.一个函数的地址是该函数的进入点,也是调用函数的地址.函数的调用可以通过函数名,也可以通过指向函数的指针来调用.函数指 ...

  4. C语言指针的那些事:第三篇(函数指针,指针函数,函数指针数组,指向函数指针数组的指针)

    文章目录 1. 函数指针 1)函数指针的例题 2. 指针函数 3. 函数指针数组 1)函数指针数组的用途 4. 指向函数指针数组的指针 5. 一些后话 1. 函数指针 函数指针就是指向函数的指针:本质 ...

  5. C++ const关键字的总结(全局/局部变量、修饰指针和引用、成员函数和数据成员、修饰类对象、const与宏定义的区别、Static与Const的区别)

    const关键字 const关键字 1.什么是const 2.使用原理 2.1.const全局/局部变量 2.2.cosnt修饰指针和引用 2.3.const修饰函数参数 2.4.const修饰函数返 ...

  6. 【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )

    文章目录 一.函数形参使用推荐方法 二.完整代码示例 一.函数形参使用推荐方法 在函数中 , 形参 中的 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收 形参中 ...

  7. 【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )

    文章目录 一.函数返回的堆内存指针 二.函数返回的栈内存指针 一.函数返回的堆内存指针 在 main 主函数中 , 调用 get_memory 子函数 , 返回 malloc 初始化的堆内存 , 可以 ...

  8. C七:指向函数的指针 ------ 函数指针(function pointer)

    函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码.一个函数的地址是该函数的进入点,也是调用函数的地址.函数的调用可以通过函数名,也可以通过指向函数的指针来调用.函数指 ...

  9. 指向成员函数的指针有什么用_指针函数,函数指针,有点懵圈了?你能分清楚吗...

    指针函数和函数指针到底怎么区分? 1.前言 数组.指针,这两个词结合的顺序不同,其意义也不同. 同样的,函数.指针这两个词结合的顺序不同其意义也不同,即指针函数与函数指针的意义不同. 2.指针函数 指 ...

  10. 返回局部变量或临时变量的地址_C++的函数不可以返回局部变量的指针

    很多童鞋在编写函数返回指针的时候,常常会出现一些列内存错误.当然这可能是很多原因造成的,但是有一个原因就是返回的是局部变量的指针.先给出结论C++的函数不可以返回局部变量的指针. 首先要明确局部变量的 ...

最新文章

  1. Python--day41--事件和信号量之模拟连接数据库并在连接三次后抛出连接超时异常...
  2. 无法对jar进行签名,Android jar signer问题
  3. 【转】闲聊Kernel engineer的境界(全)
  4. 删除所有奇数顺序表c语言,怎么将一个线性表(顺序表)拆分成两个奇偶表(C语言)?...
  5. [CQOI2009]叶子的染色(树形dp)
  6. 泉州海事学校计算机,泉州海事学校寝室图片、校园环境好吗?
  7. 动态规划编程模型的本质及应用
  8. c语言汇编程序100例,汇编语言100例
  9. java的本质_Java线程本质
  10. Normalize异常报错
  11. [跟进]_微软关闭MSN博客,腾讯第一时间抢占市场
  12. 如何查看有关计算机系统类型,电脑系统类型在哪查看
  13. 使用分身术变身术创建新进程
  14. 限制input输入字符数(中文2个字符,英文1个字符)
  15. Android悬浮窗的简单实现
  16. 每日一滴——python之time.sleep()
  17. 高速信号线PCB走线中的阻抗匹配
  18. android 4.4 锁屏密码,安卓如何绕过锁屏密码:方法都在这儿了
  19. Web在jsp页面中生成柱状图,折线图,饼状图
  20. Python配置新环境时,复制已经安装好虚拟环境的三种方法

热门文章

  1. MISRA 2004 VS MISRA 2012
  2. IP ID idle 扫描
  3. oracle中计算两个日期之间的差值
  4. P1460 健康的荷斯坦奶牛
  5. Python入门三:安装Pyqt5
  6. 简单工厂(静态工厂)
  7. java归并排序详解
  8. php中关于文件操作的面试题,php面试题及答案
  9. 0x80073712_处理win10更新提示错误代码“0x80073712”的方法
  10. Spring Cloud Zuul API 网关服务