You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指针能否接收参数?三类指针及函数指针与普通指针的区别

嘿,咱们把这个问题拆成几块来唠明白:

指针能接收参数吗?

首先得明确:普通的数据指针(比如你提到的int *ptr;)本身是不能接收参数的——它的作用就是存某个数据的内存地址,用来间接访问对应的数据。但有一种特殊指针叫「函数指针」,它指向函数的入口地址,而它关联的函数是可以接收参数的,而且函数指针的定义里也会明确包含它指向的函数的参数规则。

两个语句的具体含义

咱们逐个拆解:

  1. int *abc(int,int);
    这是一个函数声明,不是指针。这里的abc是个函数,它接收两个int类型的参数,返回值是指向int类型的指针(int*)。优先级上,函数调用运算符()比指针运算符*高,所以abc先和()结合,确定是函数,再看返回值类型是int*。

  2. int (*abc)(int,int);
    这才是函数指针的声明。括号改变了优先级,(*abc)先结合,说明abc是个指针;后面的(int,int)则明确这个指针指向的是「接收两个int参数、返回int类型」的函数。简单说:abc是个专门用来存符合这个签名的函数地址的指针。

和普通指针int *ptr;的区别

这俩是完全不同类型的指针,核心区别有这些:

  • 指向的对象不同:
    • int *ptr;是普通数据指针,指向的是int类型的数据(变量、数组元素等)的内存地址。
    • 函数指针(比如上面的abc)指向的是函数的入口地址,函数是一段可执行的代码,不是普通数据。
  • 用途不同:
    • 普通数据指针用来间接读写数据,比如*ptr = 10;就是给指针指向的int变量赋值。
    • 函数指针主要用来实现回调函数、动态选择执行的函数(比如根据不同条件调用不同的函数),比如可以把某个符合签名的函数地址赋值给它,然后通过指针调用函数:int result = abc(3,5);。
  • 类型匹配要求更严格:
    普通数据指针在某些场景下可以隐式转换(比如void*转其他指针),但函数指针的类型必须完全匹配:参数的个数、类型,返回值的类型都要和它指向的函数完全一致,否则会触发编译错误。

内容的提问来源于stack exchange,提问作者Noor Mohammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:28:19