指针函数和普通函数的区别,常量指针和指针常量的区别
大家好,关于指针函数和普通函数的区别很多朋友都还不太明白,今天小编就来为大家分享关于常量指针和指针常量的区别的知识,希望对各位有所帮助!
函数指针与指针的区别在哪里
指针是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,本文到此结束,希望对大家有所帮助。