首页技术指针函数例子?指针举例

指针函数例子?指针举例

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

大家好,今天小编来为大家解答指针函数例子这个问题,指针举例很多人还不知道,现在让我们一起来看看吧!

指针函数例子?指针举例

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

文章分享结束,指针函数例子和指针举例的答案你都知道了吗?欢迎再次光临本站哦!

matlab plot线型和颜色 matlab 颜色代码 大全电脑函数公式大全讲解?电脑函数公式大全