函数指针是否可以加加
就这么两个声明的话,没有什么错误呀,不过如果你所谓的“函数指针”是指“指向函数的指针”的话,你这两个声明都不涉及函数指针,只是有两个指向整型的指针而已
(一) 用函数指针变量调用函数
可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:
1 #include
2 #include
3
4 int main()
5 {
6 int max(int,int);
7 int (*p)(int,int);
8 int a,b,c;
9 p = max;
10 scanf("%d,%d",&a,&b);
11 c = (*p)(a,b);
12 printf("a=%d,b=%d,max=%d
",a,b,c);
13 return 0;
14 }
15
16 int max(int x,int y)
17 {
18 int z;
19 if(x>y) z = x;
20 else z = y;
21 return(z);
22 }
main函数中的" c = max(a,b); " 包括了一次函数的调用。每一个函数都占用一段内存单元。因此,可以用一个指针变量指向一个函数,通过指针变量来访问它指向的函数。
第7行:int (*p)( int,int ); 用来定义 p 是一个指向函数的指针变量,该函数有两个整形参数,函数值为整形。注意 *p 两侧的括号不可省略,表示 p 先与 * 结合,是指针变量,然后再与后面的 ( ) 结合,表示此指针变量指向函数,这个函数值 (即函数的返回值) 是整形的。如果写成 int *p ( int,int ) ,由于( )的优先级高于 *,它就成了声明一个函数P( 这个函数的返回值是指向整形变量的指针)。
赋值语句 p = max ; 作用是将函数 max 的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表该函数的入口地址。这时 p 就是指向函数 max 的指针变量,此时 p 和 max都指向函数开头,调用 *p 就是调用 max 函数。但是p作为指向函数的指针变量,它只能指向函数入口处而不可能指向函数中间的某一处指令处,因此不能用 *(p + 1)来表示指向下一条指令。
注意:
(1) 指向函数的指针变量的一般定义形式为:
数据类型 (*指针变量名)(函数参数列表)
这里数据类型就是函数返回值的类型
(2) int (* p) ( int,int ); 它只是定义一个指向函数的指针变量 p, 它不是固定指向哪一个函数的,而只是表示定义这样一个类型的变量,它是专门用来存放函数的入口地址的。在程序中把哪一函数(该函数的值应该是整形的,且有两个整形参数)的地址赋给它,他就指向哪一个函数。在一个函数中,一个函数指针变量可以先后指向同类型的不同函数。
(3) p = max; 在给函数指针变量赋值时,只需给出函数名而不必给出函数参数,因为是将函数的入口地址赋给 p ,而不涉及 实参和形参的结合问题,不能写成 p = max(a,b);
(4) c = (*p)(a,b) 在函数调用时,只需将( *p ) 代替函数名即可,后面实参依旧。
(5) 对于指向函数的指针变量,像 p++ ,p+n.....是无意义的。
(二) 用指向函数的指针作为函数参数
函数指针变量通常的用途之一就是把指针作为参数传递到其他函数。
函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,也可以是指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。
void sub ( int ( *x1) (int), int (*x2) (int,int) )
{
int a,b,i,j;
a = (*x1)(i); /* 调用 f1 函数 */
b = (*x2)(i)(j); /* 调用 f2 函数 */
}
如果实参为两个 函数名 f1 和 f2. 在函数首部定义x1、x2为函数指针变量,x1指向的函数有一个整形形参,x2指向的函数有两个形参。i 和 j 是函数f1 和 f2所要的参数。函数sub的形参 x1、x2(指针变量)在函数 sub 未被调用时并不占用内存单元,也不指向任何函数。在sub被调用时,把实参函数 f1 和 f2的入口地址传给形式指针变量 x1 和 x2.
既然在 sub 函数中要调用 f1 和 f2 函数,为什么不直接调用f1 和 f2而要用函数指针变量呢? 确实,如果只是用到f1 和 f2 函数,完全可以在sub函数中直接调用f1 和 f2,而不必设指针变量 x1 和 x2。 但是,如果在每次调用sub时,调用的函数不是固定的,下次是f3 和 f4,再是f5 和 f6...这时用指针变量就比较方便了。
假设我定义了两个函数
int func1(int i,int j){
return i+j;
}
int func2(int i,int j){
int a=1;
return i+j;
}
int main()
{
int(*func_def1)(int,int)=func1;
int(*func_def2)(int,int)=func2;
int val=func_def2-func_def1;
}
首先,如果我们定义了两个char*类型的指针,那么两个相减除以char的宽度1就是这两个指针的差
倘若是两个char**类型的相减,那就是两个指针相减除char*的宽度4就是这两个指针的差,所以两个指针相减就是把两个指针的差除以两个指针抹去一颗星之后的类型的宽度就是它的最终结果。
那func_def2-func_def1是什么结果呢?
func_def2是int(*)(int,int)类型的,去掉一颗星是int (int,int)类型的函数,巧了,func1和func2都是int (int,int)类型的,类型是相等的
那么最终结果就是func_def2的地址减去func_def1的结果除以func_def2长度或者func_def1的长度
这种结果显然不合理,结果不是唯一的
因为func_def2生成的机器码程序长度显然和func_def1的长度是不同的,自然不可以对函数指针进行加减运算,所以对函数指针加减一个常数也是不行的
但是函数指针可以比较大小,因为比较大小的操作仅仅是对地址进行比较,并不涉及指针的加减运算
显然可以。*p++,就指向了*p所指内存的下一个地址。假设有一个数组a【3】。P=a;则*p++就等于a【1】。而假设是二维数组,a【3】【4】,令p=a,则*p++就等于a【1】【0】。它直接跨过了a【0】【1】,a【0】【2】,a【0】【3】,a【0】【4】。呵呵,仔细想一想。
函数指针 指向函数的指针!不能加加!
函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。
可以的。
你比如:
#include "stdio.h"
void main()
{
int a[3]={1,2,3};
int*pa=a;
printf("%d",*pa);
pa++;
printf(" %d",*pa);
}
两个int指针相加可以么?
4、“+”运算是不可以的,因为两个指针相加什么都得不到,所以规定不允许相加。
两个相同的指针变量能不能相加!为什么?
3、指针可以相减,可以和立即数加或减,是有意义的,是允许的。比如我想知道N1和N2之间到底间隔了多少字节的内存,两者相减就相当于尺子上两个刻度相减,也就是长度或者宽度了。另外,和立即数的加减主要用来快速寻址,比如我有一个数组,起始指针为P0,如果数组保存的是一系列INT值,那么 P0+2*sizeof...
函数指针是否可以加加
先说结论,函数指针不能加减 假设我定义了两个函数 int func1(int i,int j){ return i+j;} int func2(int i,int j){ int a=1;return i+j;} int main(){ int(*func_def1)(int,int)=func1;int(*func_def2)(int,int)=func2;int val=func_def2-func_def1;} 首先,如果我们...
c语言为什么不可以2加加
因为str是个指针,所以不可以。str+2是指针偏移,指向str{2},也就是i。所以输出ina,指针变量实际上是一个地址,两个地址相加得到的还是地址。然而,这个地址是不确定的如果使用可能会出错。
c语言中的指针应该怎么理解?
指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。 第二章。指针的算术运算 指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如: 例二: 1。 char a[20]; 2。 int *ptr=a; ... ... 3。 ptr++; 在上例中,指针ptr的类型是int*,它...
c语言 一个指针值加上一个整型值是什么意思?
可以相加啊,指针加整数表示指针移动,相应类型所占内存单位大小 乘 整数值 譬如 int num = 9;int* p = #假设, p 现在存有地址 0x1002,int类型为2字节 则 p + num 就等于 0x1002+2*9 = 0x1020
关于指针的问题,大虾们!!帮帮忙·
是。那么你的程序里面只是定义了 int a[10]; 怎么能加20呢?这里引用一楼的回答"+号对于指针运算不是简单的代数运算,而是使指针指向下一个地址。"对于指针你要注意它的类型,如"int, char"。他们的作用就是让指针可以像常数一样使用“+ -”的。 建议你再看看指针的那一章,在理解理解,其实...
C语言中自加++自减--运算的数据类型可以是Float和Double么?
自加++自减--运算的数据类型可以是Float和Double。在c语言中,并不是所有变量都可以使用自增自减操作符;可以使用自增自减操作符的数据类型有:int、float、double 、char、long。自增(++) :将变量的值加1,分前缀式(如++i) 和后缀式(如i++) 。前缀式是先加1再使用;后缀式是先使用再加1...
在C语言中,数组名可以做加法和减法吗?
C语言中,数组名是一个不可变的指针常量,不能对它进行加、减和赋值运算。在C语言中规定,数组名是代表该数组的首地址且符合标识符书写规定的变量标识符。不能对它进行加、减和赋值运算。整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c[10],设数组c的首地址为2000,也就是说c[...
c语言的一道题
A中的结果是个指针,不可能是5 C中语法错误,m是指针必须用->来访问 B和D的区别就在前加加和后加加,p是个指针,对指针做加加运算会跳过一个数据位,而数据位大小取决于p的类型,这里会跳过一个st结构体大小,p初始时指向s[0],加加之后会指向s[1],s[1]中的m指向的值正是我们需要的,...
氐蔡咳特: 显然可以.*p++,就指向了*p所指内存的下一个地址.假设有一个数组a【3】.P=a;则*p++就等于a【1】.而假设是二维数组,a【3】【4】,令p=a,则*p++就等于a【1】【0】.它直接跨过了a【0】【1】,a【0】【2】,a【0】【3】,a【0】【4】.呵呵,仔细想一想.
涞源县15283799246: C语言中哪些指针不能做++运算 - ?
氐蔡咳特: 常量指针不可以做++运算, 比如 int const *p;不能对指针作++运算,这种指针表示,指针的地址不能被改变,可以改变指针地址中的值.因此不能做++运算.
涞源县15283799246: 在C语言中,指向函数的指针怎么调用函数? - ?
氐蔡咳特: 如果存在函数指针p,以*p取函数指针的值,然后加上参数列表调用即可. 即 ret = (*p)(arg_list); 如,p为int (*)(int)类型的函数指针,那么 int a = (*p)(10); 这样就是一次典型的函数指针调用.
涞源县15283799246: 函数指针的赋值与调用? - ?
氐蔡咳特: 第一个问题,两个都是可以的.函数名是一个地址,可以将他赋值给一个指向函数的指针.前面加了&符号其意义是一样的.比如定义一个数组arr[],arr表示这个数组的首地址,但&arr同样表示他的首地址.这些都是设计语言时这样规定的 第二个问题也是这样,比如你定义一个字符串指针char *str, 输出str 他并不是输出了地址,而是输出存在该地址的值,所有这些设计都是为了方便使用,而不是为了符合同一个规则
涞源县15283799246: 关于指针数组能否做++运算. - ?
氐蔡咳特: 把*去掉,用e++ 正确代码 #include #include int main() { char *e; char a[3]={'A','B','C'}; e=a; int i; for(i=0;i<3;i++) { printf("%d\n",e++); } system("pause"); return 0; }
涞源县15283799246: 2个数相加,用指针进行操作? - ?
氐蔡咳特: 能! #include<iostream> using namespace std; void plus(int *a,int *b); int main() { int a=3; int b=4; plus(&a,&b); return 0; } void plus(int *a,int *b) { int temp; temp=*a+*b; cout<<"相加的结果是"<<temp<<endl; } 像这种十几句的代码似乎不值得用指针进行加减运算,但将来几千句后就会很有用了!
涞源县15283799246: C语言中调用函数的返回值只要是指针,定义函数是不是就得加*?
氐蔡咳特: 是的例如int *ff(a[],n) {return a[n]}那么返回的就是a[n]这个元素,并且有一个指针指向它.
涞源县15283799246: C++的函数指针作为形参为什么不能加const - ?
氐蔡咳特: 可以加 const 啊. const 的量,可以做右值,不可做左值. 下面是例子.funA 是 const 普通指针形参, funC 是 const 函数指针形参. #include <stdio.h> int funA(const int *p, int n){ int i,sum=0; for (i=0;i<n;i++)sum=sum+p[i]; return sum; } int funB(...
涞源县15283799246: C语言指针类型的变量可以加引用吗 - ?
氐蔡咳特: C语言是没有引用这个定义的,c++里面才有,它主要是带回作用,不过指针也可以起到带回作用,带回的是指针所指向的值而不是指针本身. 像这种如果是保证F指向的值带回的话,可以不用引用. 就像C语言介绍的真交换一样,用指针就可以带回.