指针函数例子?指针举例
大家好,今天小编来为大家解答指针函数例子这个问题,指针举例很多人还不知道,现在让我们一起来看看吧!
C语言 指针函数 函数指针 什么区别联系最好有例子一定采纳
没觉得指针函数这个概念有什么大的意义。。。。可能其最大的意义就是拿过来和函数指针一起混淆初学者的视听吧。
指针函数指的是返回一个指针的函数,比如我们常见的gets(),strcpy(),strcat(),malloc()等等。如果单独把它当成一个新概念真的没有什么意义。这些函数除了返回一个指针之外没有任何共性,但是返回的指针又天差地远。
下面说说函数指针。
指针分为三种类型:对象指针,函数指针和void指针。
函数指针的声明形式是T(*p)(...),其中*p使用括号括起来的原因是函数类型解析的优先级高于指针的解析,故使用括号防止解析成上面的指针函数(其实这两个之间就相差了一对括号)。
函数指针可以绑定到与其返回值和参数类型都相同的函数上。比如:
intfoo(int,double);//函数声明
int(*bar)(int,double)=foo;//函数指针在上面的初始化中,写成&foo也是可以的。
函数指针的最大特点就在于,其不能做一元+-运算(当然也不能做+=-=++--等),且对其做一元*运算的结果还是其本身。例如:(接着上面的例子)
bar(1,1.0);
(*bar)(1,1.0);//两种情况等价甚至你还可以这样:
(**************bar)(1,1.0);依然是对的。
所以实际应用中一般采取类似函数调用的方式,这样更加自然。
刚刚去测试了一下,还有一个更加隐蔽的问题:
C中的函数可以采用使用原型或者不使用两种方式。(不使用原型被视为过时)
原型即在函数头中将参数类型及个数都声明,而不使用就是很简单的一对括号。例如:
intfoo();//非原型
intbar(void);//原型
intfoo1(int);//原型这有什么影响呢?看一看下面的一段代码:
intfoo(inti){returni;}//原型
intfoo1(doublec){return(int)c;}//原型
intbar(){return1;}//非原型
intmain(void)
{
int(*foobar)(int);//原型
int(*barfoo)();//非原型
foobar=foo;
foobar=&foo;
foobar=bar;
foobar=foo1;//this
barfoo=foo;
barfoo=bar;
barfoo=foo1;
foobar(1);
(*foobar)(1);
(*************foobar)(1);
return0;
}我的编译器对this指的一行进行了警告,提醒指针类型不匹配。
我们可以看到,非原型的函数指针可绑定到任意的函数上,而带有原型的函数指针在绑定时可以起到更严格的类型限制。
容易忽略的一点是,不接受任何参数的函数(带原型)的声明方式是int foo(void);,不应该省略void,特别是在使用对应类型的函数指针时,如果省略void,那么错误的绑定也不会被警告。
我还注意到了一个现象:
intfoo(char);
int(*bar)()=foo;这段代码同样也给了警告。为什么呢?
因为在不使用原型的情况下,char,short,float等会被隐式提升到与其对应的更高级类型。
而在这个绑定中,bar是非原型,这时可能会进行整型提升,而foo带有原型,调用时不需要进行提升。这样就有可能引发错误。
以上就是函数指针使用过程中需要注意的一点。不过提醒LZ,函数指针使用过程中最好还是使用带有原型的函数指针。
函数指针定义
函数指针:
函数指针是指向函数的指针变量。因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
函数指针的声明方法为:
返回值类型(*指针变量名)([形参列表]);
注1:“返回值类型”说明函数的返回类型,“(指针变量名)”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:
int func(int x);/*声明一个函数*/
int(*f)(int x);/*声明一个函数指针*/
f=func;/*将func函数的首地址赋给指针f*/
或者使用下面的方法将函数地址赋给函数指针:
f=&func;
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
注2:函数括号中的形参可有可无,视情况而定。
下面的程序说明了函数指针调用函数的方法:
例一、
#include<stdio.h>
int max(int x,int y){return(x>y? x:y);}
int main()
{
int(*ptr)(int, int);
int a, b, c;
ptr= max;
scanf("%d%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d, b=%d, max=%d", a, b, c);
return 0;
}
ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。
不过,在某些编译器中这是不能通过的。这个例子的补充如下。
应该是这样的:
1.定义函数指针类型:
typedef int(*fun_ptr)(int,int);
2.声明变量,赋值:
fun_ptr max_func=max;
也就是说,赋给函数指针的函数应该和函数指针所指的函数原型是一致的。
例二、
#include<stdio.h>
void FileFunc()
{
printf("FileFunc\n");
}
void EditFunc()
{
printf("EditFunc\n");
}
void main()
{
typedef void(*funcp)();
funcp pfun=FileFunc;
pfun();
pfun=EditFunc;
pfun();
}
C语言指针问题
1.
这里根本就没有赋值的语句,所以没有复制。
(*s)&&(*t)&&(*t++==*s++)这个条件就是没到s的结束且没到t的结束且*t==*s,就循环,t和s的指针都往后移。
2.
p是指针数组,就是有两个指针
for(i=0;i<2;i++) p[i]=ch[i];这个就是赋值给p指针,其中p[0]等于ch二维数组的第0行的首地址,p[1]等于ch二维数组的第1行的首地址
for(i=0;i<2;i++)//循环p指针数组
for(j=0;p[i][j]>'\0';j+=2)//间隔j+=2循环p[i]指向的数组,当i=0时就是ch二维数组的第0行,i=1时就是ch二维数组的第1行
s=10*s+p[i][j]-'0';//就是ch的第i行第j列减去'0',这样要注意,这是个字符,ASCii是0x30,'6'-'0'= 0x36-0x30= 0x06
//所以答案是6385
3.
数组变量实际上就是地址
str是这个数组的首地址,相当于&str[0]
str+1就是&str[1],
strcat(p1,p2)返回就是把p2接在p1后就成了"abcabc
strcpy(str+1,strcat(p1,p2))就是把strcat(p1,p2)的返回复制到str+1上,就是从&str[1]开始
原来str[50]="abc";从&str[1]开始就是把b及后面的覆盖就成了aabcabc
文章分享结束,指针函数例子和指针举例的答案你都知道了吗?欢迎再次光临本站哦!