首页技术指针函数和普通函数的区别,常量指针和指针常量的区别

指针函数和普通函数的区别,常量指针和指针常量的区别

编程之家2026-06-15800次浏览

大家好,关于指针函数和普通函数的区别很多朋友都还不太明白,今天小编就来为大家分享关于常量指针和指针常量的区别的知识,希望对各位有所帮助!

指针函数和普通函数的区别,常量指针和指针常量的区别

函数指针与指针的区别在哪里

指针是C语言的一种数据类型;

函数指针是C指针的一种。

问“函数指针与指针的区别在哪里?”说明LZ对指针还不慎了解。修改一下你的问题:

“函数指针与整型指针的区别在哪里?”

这样的话,我就告诉你:

1.二者都是指针

指针函数和普通函数的区别,常量指针和指针常量的区别

2.函数指针里存放的是一个函数的首地址,而整型指针里放的是一个整型变量的地址;

3.指针本身是引用类型。所以使用时都要解除引用。函数指针与整型指针解除引用的方式不同。整型指针有两种方式解除引用:

如对整型指针pi:

int i= 0;

int*pi=&i;

解除引用方法一:*pi

指针函数和普通函数的区别,常量指针和指针常量的区别

解除引用方法二: pi[0]

对函数指针pf:

int f(int);

int(*pf)(int)= f;

解除引用方法: pf(8);

整型指针解除引用方法二: pi[0]更像数组。也更像函数指针解除引用的方法,原因是:

数组名、和函数名的本质都是地址。指针的本质也是地址。

4。从以上例子中看到赋值形式不同

函数指针 pf= f;(不用&。其实用也一样)

整型指针 pi=&i;

原因是数组名、和函数名的本质都是地址,而整型变量的本质(当作为左值【如果允许】或右值时)是地址里的值。

5.对函数指针,一般不可以做递增操作如:pf++ 99.9999%会崩溃

如果要访问函数阵列,需要使用函数指针数组

指针函数和指向函数的指针在意义和用法上有什么区别

函数指针和指针函数的区别:

一、【函数指针】

在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。

1、函数指针定义

函数类型(*指针变量名)(形参列表);

“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例如:

int(*f)(int x);

double(*ptr)(double x);在定义函数指针时请注意:

函数指针和它指向的函数的参数个数和类型都应该是—致的;函数指针的类型和函数的返回值类型也必须是一致的。

2、函数指针的赋值

函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。例如,

int func(int x);/*声明一个函数*/

int(*f)(int x);/*声明一个函数指针*/

f=func;/*将func函数的首地址赋给指针f*/

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

3、通过函数指针调用函数

函数指针是通过函数名及有关参数进行调用的。

与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。

由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:首先,要说明函数指针变量。

例如:int(*f)(int x);

其次,要对函数指针变量赋值。

例如: f=func;(func(x)必须先要有定义)

最后,要用(*指针变量)(参数表);调用函数。

例如:(*f)(x);(x必须先赋值)

【例】任意输入n个数,找出其中最大数,并且输出最大数值。

main()

{

int f();

int i,a,b;

int(*p)();/*定义函数指针*/

scanf("%d",&a);

p=f;/*给函数指针p赋值,使它指向函数f*/

for(i=1;i<9;i++)

{

scanf("%d",&b);

a=(*p)(a,b);/*通过指针p调用函数f*/

}

printf("The Max Number is:%d",a)

}

f(int x,int y)

{

int z;

z=(x>y)?x:y;

return(z);

}

运行结果为:

343-45 4389 4235 1-534 988 555 789↙ The Max Number is:4389

二、【指针函数】

一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。

返回指针的函数,一般定义格式为:

类型标识符*函数名(参数表)

int*f(x,y);

其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。f(x,y)是函数,其值是指针。

如:char*ch();表示的就是一个返回字符型指针的函数,请看下面的例题:

【例】将字符串1(str1)复制到字符串2(str2),并输出字符串2.

#include"stdio.h"

main()

{

char*ch(char*,char*);

char str1[]="I am glad to meet you!";

char str2[]="Welcom to study C!";

printf("%s",ch(str1,str2));

}

char*ch(char*str1,char*str2)

{

int i;

char*p;

p=str2

if(*str2==NULL) exit(-1);

do

{

*str2=*str1;

str1++;

str2++;

}

while(*str1!=NULL);

return(p);

}

通过分析可得:

函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,函数指针可以用来指向一个函数。

函数句柄和指针的区别是什么

句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。当你需要对某个内存进行直接操作时,可以使用GlobalLock锁住这段内存并获得指针来直接进行操作。“句柄”(handle),handle的本意是把柄,把手的意思。是你与操作系统打交道的东西。举个例子:比如你做了亏心事(我说的是比如,呵呵),不幸让我抓住了把柄,那么我让你做什么你就得做什么,因为你的把柄在我这。我们编程的时候也是这样,比如我们要想操纵一个窗口,那我们就必须“抓住它的把柄”,只有这样,我们才能改变它的属性,改变它的式样,甚至销毁它(狠了点儿)。我们再引用一个通俗一点的例子,比如你考上了大学,入学后,学校(操作系统)会给你一个学生证号。注意,这个号码是学校指定的,你无法自选。有了这个号码(学生证,假设一证多用)就可以享受学校提供的服务:如你就可以去图书馆借书,去食堂吃饭,去教室上课等等。但你不能到食堂里买啤酒,因为学校不允许这种服务。而在计算机中系统提供的服务就是API调用,你有了HANDLE,就可以理直气壮地向系统提出调用API的服务。而指针的权力就大多了,有了指针你可以到处去喝酒,打架,学校(操作系统)管不着,所以句柄和指针的区别在于句柄只能调用系统提供的服务。而句柄虽然是一个能相互区别的号码,但与我们普通的ID号又有区别,普通的ID号是可以由程序员自己定义的,而句柄不行,它是对象生成时系统指定的,是为了区别系统中存在的各个对象,这个句柄不是由程序员赋给的。实际应用中,最常用的就是文件句柄和窗口句柄。例如,窗口句柄的值是一个长整数,每个窗体都用一个句柄来表示。所以句柄是不会重复的,很多的函数都会用到窗体的句柄。

OK,本文到此结束,希望对大家有所帮助。

不收费的ai软件?不受限制的免费ai软件仙域百花谷加点,蜀门手游百花技能加点推荐