辨析函数指针变量和指针型函数

  在上一篇随笔(顺序表基本操作算法的代码实现)中,LocateElem()函数的第三个形参的形式是:

    Status (*compare)(Elemtype e,Elemtype temp);

  这是一个函数指针变量,借此机会记录一下函数指针变量和指针型函数的区别。

一、写法上的区别

函数指针变量 指针型函数
int (*function)(int i); int  *function(int i){}

  上面是一个例子,可看到函数指针变量只是在:*function处比指针型函数多了一对小括号,下面是两者的一般形式:

函数指针变量:

类型类型说明符 (*指针变量名)(形参表);

指针型函数:

类型说明符 *函数名(形参表){

}

二、概念上区别

  • 函数指针变量:指向函数入口的指针变量(本质是变量)

    在随笔的开头,LocateElem函数的形参中就有一个函数指针变量,在函数的调用过程中,只要将真正要使用的函数名作为实参传递,就可以调用改函数。为什么会这样           呢?因为函数在使用时,函数的名称就像数组名一样表示了一个地址,名称指向了函数的入口地址。通过将函数名赋值给一个函数指针变量,这个函数指针变量就指向了一个         特定函数;类似于定义一个变量,将数组的首地址赋值给该变量,就可以通过该指针处理这个数组。

  • 指针型函数:返回值为指针类型的函数(本质是函数)

    既然只指针型函数的本质是一个函数,则它一定具有相应的函数体。而这个函数与一般函数的区别就是他的返回值是一个指针类型,这里有点迷惑人的地方是:

函数头上已经写了返回值的类型说明符是int(见一中的例子),为什么又说返回值是一个指针类型呢?这个理解是有些偏差的。

    首先要清楚的是,定义一个指针变量,是得要确定指针指向的变量类型的。比如说:int *p;

  上个语句执行后,会产生一个指针p,他指向一个整数类型。以此类推,在指针型函数中,类型说明符是对指针变量的一个说明,在int  *function(int i){}这个例子中,指针型       函数的意义是函数返回一个指向整数类型指针变量。

三、结语

  在分辨这两个概念时,只要时刻谨记他们的本质就可以:函数指针变量本质是变量,那么对于变量的一切操作,它都兼容;指针型函数是一个函数,只是说函数的返回值比较特殊,是一个指向类型说明符的指针变量。

时间: 2024-08-05 11:13:17

辨析函数指针变量和指针型函数的相关文章

Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇也就够了,不过我也尽量陈述的很详细 一.指针 要说指针,其实通俗易懂的话来说,他应该是保存内存地址的一个变量,我们来看一下小例子 #include <stdio.h> #include <stdlib.h> main(){ //int 变量 int i ; i = 5; //打印i的值

指针的含义——指针变量、指针的指针、指针使用的注意

指针其实很容易理解的,其他并不是大家想象的那么神奇,那么难. 一.指针的含义:指针其实就是一个变量,它所存放的不是数据,而是数据在内存中地址.当然指针也可以存放函数(方法)的地址,后面会讲到的.声明指针的关键符是*号,指向地址的关键符是&. 二.指针变量: 例如1:#include <stdio.h> int main {  int a =10;   //第一一个变量a,赋值为10 int *p = &a;   //p就是一个指针变量,所指向的就是变量a的地址 printf(&

C/C++函数、变量和指针

动态内存分配是指在程序运行时为程序中的变量分配内存空间,其完全由应用程序自己进行内存的分配和回收.然后内存分配方式并不是唯一的,内存分配方式包括以下3中: 1.从静态存储区域分配内存 程序在编译时就已经把该程序所占用的内存分配好了,并且该内存在整个程序的运行过程中一直是有效的,例如存放全局变量和静态变量.初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统自动释放该内存. 2.在堆栈上分配 在函数执行的这段时间,函数内部的局部变量的存储

指针变量作为函数参数(1)

普通函数参数 下面程序试图改变main函数中a和b的值 #include<stdio.h> void fun(int x,int y) { int c; c=a; a=b; b=c; } int main() { int a=1,b=2; fun(a,b); printf("a=%d b=%d\n",a,b); return 0; } 函数参数传递分析: 实参: &a 28ff18 a  1 &b 28ff14 b  2 在将实参传递给形参的时候,编译器将实

&lt;22&gt;【掌握】指针变量概念及定义方法+【理解】两变量值交换的方法+【掌握】总结*使用场合

[掌握]指针变量概念及定义方法 1.指针变量 用来存放地址的变量,就是指针变量 2.指针? 就是地址,地址是个常量 3.指针变量的定义 数据类型 *指针变量名; int *p; //定义了一个指针变量,变量名是p //int表示,p只能存放一个int类型的变量的地址 char *p1; //定义了一个指针变量,变量名是p1 //p1只能存放一个char类型数变量的地址 int num=10; char *p = &num; //警告 4.指针变量定义的注意事项 1)“*” 必须得有,如果没有就相

指针数组和二维数组指针变量

指针数组 概念: 一个数组的元素值为指针则是指针数组. 指针数组是一组有序的指针的集合. 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量. 指针数组说明的一般形式为: 类型说明符 *数组名[数组长度] 其中类型说明符为指针值所指向的变量的类型. 例如: int *pa[3] 表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量. 1.用一个指针数组来指向一个二维数组. 指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数

[日常] C语言中指针变量

CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址.编译和链接过程的一项重要任务就是找到这些名称所对应的地址. #include <stdio.h> //指针变量测试 //指针变量存储的值是另一个变量的地址,也就是说改指针变量指向了另一个变量 int main(){ int a=10; int c=20; //1.打印出变量的内存地址 printf("%#X \n",(unsig

C语言---指针变量详解1

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量.在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.指针变量的值就是某份数据的地址,这样的一份数据可以是数组.字符串.函数,也可以是另外的一个普通变量或指针变量. 现在假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示).另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们

c++中的悬浮指针和野指针 二级指针

(1) c++中的悬浮指针:声明了但没有被付值的指针,它指向内存中的任意一个空间.避免悬浮指针的一个方法是开始就付值为NULL (2)"野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用.野指针的成因主要有两种: 一.指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同