百度
360搜索
搜狗搜索

函数指针的调用,当一个函数的返回值为指针类型时如何调用详细介绍

本文目录一览: 带指针的函数怎么调用?

什么叫带指针的函数?说清楚点嘛?
1.如果是返回值是指针
char* getname()
{
char* pname=new char[23]; //返回指针必须是函数释放后并未释放的内存空间,
cout<<"input your name:\n"; //一般返回两种情况,一是在函数中像该函数一样动态分配堆内存
cin.getline(pname,22); //二是返回指针指向参数中地址,如: int* max(int a,int b) { return &a; }
pname[22]='\0';
return pname;
}
int main()
{
char* name=getname();
cout<<"your name is: "<
<name<<endl;
delete []name; //记得动态释放分配内存

return 0;

}

2.参数是指针类型

常见的是通过指针或引用交换两个数的值

void swa(int* p1,int* p2)

{

int temp=*p1; *p1=*p2; *p2=temp;

}

int main()

{

int a=2,b=3;

swa(&a,&b); //传递地址

return 0;

}

附解:你可以把指针看做是一种复合类型,它之所以可以修改参数值,本质是因为

对指针解除引用*p形式是操作的参数所存数据内存空间,但如果它不解除引用,它

并不会修改参数的值:如

void swa(int* p1,int* p2) //函数意思是最初始在函数参数块中定义两个指针p1,p2,使

{ //p1指向a,p2指向b,下面函数体只是使指针指向地址改变,成了

//p1指向b,p2指向a。但并未对a,b内存空间操作,当函数调用结束后,指针p1,p2

//也释放了,所以并未起任何作用

int* temp;

temp=p1; p1=p2; p2=temp;

}

int main()

{

int a=2,b=3;

swa(&a,&b); //传递地址

cout<
<a<<" "<<b;
return 0;

}

这个函数并不会交换a,b的值
</a<
</name<<endl;

当一个函数的返回值为指针类型时如何调用

返回指针的函数必须保证退出函数后该指针的目标原则上没有消亡
方法1,直接赋值给另一个同类型指针
方法2,直接加上指针运算符*在赋值号左边对指针所指目标间接访问
返回值类型为指针的函数格式:type * function(){…},其中type为某种类型(如char、int等,或类、结构体等等),function为一个函数名。
调用方式:
type * var; //定义一个与返回值类型相同的指针变量
var = function(); //执行函数,并将返回值赋值给变量var
cout<<*var; //输出指针所指向的值,C语言输出用printf()函数
或:cout<
<var[i]; 若指针指向数组变量的,则通过此形式输出或调用其值

如何调用指针函数

1.如果是返回值是指针
char* getname()
{
char* pname=new char[23]; //返回指针必须是函数释放后并未释放的内存空间,
cout<<"input your name:\n"; //一般返回两种情况,一是在函数中像该函数一样动态分配堆内存
cin.getline(pname,22); //二是返回指针指向参数中地址,如: int* max(int a,int b) { return &a; }
pname[22]='\0';
return pname;
}
int main()
{
char* name=getname();
cout<<"your name is: "<
<name<<endl;
delete []name; //记得动态释放分配内存

return 0;

}

2.参数是指针类型

常见的是通过指针或引用交换两个数的值

void swa(int* p1,int* p2)

{

int temp=*p1; *p1=*p2; *p2=temp;

}

int main()

{

int a=2,b=3;

swa(&a,&b); //传递地址

return 0;

}

附解:你可以把指针看做是一种复合类型,它之所以可以修改参数值,本质是因为

对指针解除引用*p形式是操作的参数所存数据内存空间,但如果它不解除引用,它

并不会修改参数的值:如

void swa(int* p1,int* p2) //函数意思是最初始在函数参数块中定义两个指针p1,p2,使

{ //p1指向a,p2指向b,下面函数体只是使指针指向地址改变,成了

//p1指向b,p2指向a。但并未对a,b内存空间操作,当函数调用结束后,指针p1,p2

//也释放了,所以并未起任何作用

int* temp;

temp=p1; p1=p2; p2=temp;

}

int main()

{

int a=2,b=3;

swa(&a,&b); //传递地址

cout<
<a<<" "<<b;
return 0;

}

这个函数并不会交换a,b的值
</a<
</name<<endl;

C语言 怎么调用指针数组函数

指针数组 就是有一个数组,数组中的元素都是指针,这些指针有相同的类型
int *a[3];
char *b[4];
double *c[5];
--------------------------------------------------------
char paixu(char *a[5]) //这样才是字符串数组
{
int i,j;
char *p;
for(i=0;i<5;i++)
{
for(j=0;j<4-i;j++)
{
if(strcmp(a[j],a[j+1])>0)
{
p=a[j]; a[j]=a[j+1]; a[j+1]=p;
}
}
}
}
#include

#include

void paixu(char **a)

{

int i,j;

char *p;

for(i=0;i<5;i++)

{

for(j=0;j<4-i;j++)

{

if(strcmp(a[j],a[j+1])>0)

{

p=a[j];

a[j]=a[j+1];

a[j+1]=p;

}

}

}

}

void main()

{

char *a[]={"Hongkong",

"Singgapore",

"Beijing",

"London",

"Washington"

};

int i;

printf("输出地址\n\n");

for(i=0;i<5;i++)

{

printf("%s \n",a[i]);

}

paixu(a);

printf("最终排序是\n\n");

for(i=0;i<5;i++)

{

printf("%s \n",a[i]);

}

}

main函数中a是常指针,它指向一组数组,这组数组每个元素又是指向字符串的指针,所以数组中每个元素的类型是char* , 因此变量a的类型是(char*)*,即char**.排序没有必要返回char吧(完成排序功能还用返回一个字符么?),函数参数改为char**类型,这样才能将指针数组首地址传入函数.

向函数里传入的是数组指针,我更改的是数组元素,这是明显的按地址传递方式传递参数,还用再return么.

1.函数指针的数组定义方法:返回值类型( * 指针变量名[Number]) (形参列表)。例如:double add(double a,double b){};double sub(double a,double b){};double mul(double a,double b){};double div1(double a,double b){};double (*oper_func[])(double, double) = {add,sub,mul,div1};//函数指针的数组定义2.函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。3.函数指针的声明方法为:返回值类型( * 指针变量名) (形参列表);“返回值类型”说明函数的返回类型,“( * 指针变量名)”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:int func(int x); /* 声明一个函数 */int (*f) (int x); /* 声明一个函数指针 */f = func; /* 将func函数的首地址赋给指针f */或者使用下面的方法将函数地址赋给函数指针:f = &func;赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。例子:

#include

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;}

阅读更多 >>>  卡西欧gshock表针怎么调

直接调用函数与通过函数指针调用有什么不一样

函数指针是指向函数的指针变量。也就是说,它是一个指针变量,而且该指针指向一个函数。
对于指针变量来说,它的值是它指向的变量的地址。举个例子:指针变量pi是指向一个整型变量i的指针,则变量i的地址 &i 就是指针变量pi的值。也就是说整型变量指针指向一个整型变量,而整型变量指针的值就是它所指的整型变量的地址。与其它类型指针变量一样,函数指针变量的值就是它指向的函数的地址。
那么什么是函数的地址呢?
我们首先来看函数调用是怎么回事。在程序运行时,一个函数占用一段连续的内存。当调用一个函数时,实际上是跳转到函数的入口地址,执行函数体的代码,完成后返回。
函数指针指向一个函数的入口地址,也就是函数存储空间的首地址。
在C语言中,数组名代表数组的首地址,同样函数名代表了函数的首地址,因此在赋值时,直接将函数指针指向函数名就行了。
函数指针的定义
一般,函数指针的定义格式为:
函数类型 (*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:对于函数int f(int a),我们定义一个指向该函数的函数指针fp,采用如下格式:
int (*fp)(int a);
函数指针的赋值
前面我们已经讲到,在C语言中,函数名代表了函数的首地址,因此在赋值时,直接将函数名赋值给函数指针就可以了。
例如:
int func(int x); //声明一个函数
int (*fp)(int x); //定义一个函数指针
fp = func; //将func函数的首地址赋值给指针fp
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针就指向函数func(x)的代码的首地址。
通过函数指针调用函数
与其它指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*pi等于它所指向的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,fp是指向函数func(x)的指针,则*fp就代表它所指向的函数func。所以在执行了fp = func;之后,(*fp)和func代表同一函数。
由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。
用函数指针调用函数由三步组成:
首先,定义函数指针变量。
例如:int (*fp)(int x);
然后,给函数指针变量赋值。
例如:fp = func; (func(x)必须要先有定义)
最后,用(*指针变量)(参数表);调用函数。
例如:(*fp)(x);(x必须先赋值)。
在这里,(*fp)(x);一般写成fp(x); fp(x)是标准C++的写法,(*fp)(x);是兼容C语言的标准写法。
总结以上知识,举例说明
到目前为止,相信您已经简单了解了函数指针,下面我们举一个简单的、完整的程序进行说明。
类定义完了,,不管实例化多少个对象,,他们每个成员函数在所有对象实例是共享一个地址的,,也就是函数入口地址是唯一的,,并不是有多少份对象就有多少份成员函数;
明白上面那个就简单了,,用指针调用,无非是将函数入口地址,,指针就代表的一个地址而已,,你直接调用也是暴露地址,,直接调用你必须把对象暴露出来,后台做地址映射,,
而指针调用,,你要是想隐藏掉后台实现细节,,别人是不知道你的调用过程的,,只有一个地址。。
什么是直接调用?
什么是通过指针调用?
C++里面,函数名本身就是一个指向函数首地址的指针。
我想这情况会解决你的问题。
你知不知道,在Windows中,如果你要更改某个文件夹的图标或设置某种类型文件的图标时,会有一个选择图标的对话框,默认情况下是显示的shell32.dll中的图标。当你指定一个有图标资源的exe文件或dll文件时,对话框会自动列出其中的图标资源。
这个对话框其实可以用一个函数实现的,但是,C++中没有这个函数的定义,这个函数就在shell32.dll中,我要让你调用这个函数显示一个图标选择对话框,你怎么办?
如楼上所说,可以增加程序的灵活性。
比如你的程序中有100个子函数,在程序在开始时让你输入1-100来选择运行哪个子函数,如果你用1个函数指针数组p[100]去指向这100个子函数,用n来接收你输入的编号,那么就可以直接用p[n](。。。)来调用相应子函数了。
直接用函数名调用可读性好一点,如果想写一个通用一点的方法来处理不同的函数,则调用不同函数的地方需要多次类似重复地使用不同的函数去调用。
函数指针就可以避免这个问题,不管是普通调用或者是形参,只要参数类型和返回值一致即可,不必重复使用函数名,尤其是函数指针数组更是使用得广泛,比如虚函数表就是这样一个函数指针数组。
一、
在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义:
1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针
类型标识符 *函数名(参数表)
int *f(x,y);
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
表示:
float *fun();
float *p;
p = fun(a);
注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
来讲详细一些吧!请看下面
指针函数:
当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。
格式:
类型说明符 * 函数名(参数)
当然了,由于返回的是一个地址,所以类型说明符一般都是int。
例如:int *GetDate();
int * aaa(int,int);
函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。
int * GetDate(int wk,int dy);
main()
{
int wk,dy;
do
{
printf(Enter week(1-5)day(1-7)\n);
scanf(%d%d,&wk,&dy);
}
while(wk<1||wk>5||dy<1||dy>7);
printf(%d\n,*GetDate(wk,dy));
}
int * GetDate(int wk,int dy)
{
static int calendar[5][7]=
{
{1,2,3,4,5,6,7},
{8,9,10,11,12,13,14},
{15,16,17,18,19,20,21},
{22,23,24,25,26,27,28},
{29,30,31,-1}
};
return &calendar[wk-1][dy-1];
}
程序应该是很好理解的,子函数返回的是数组某元素的地址。输出的是这个地址里的值。

2、函数指针是指向函数的指针变量,即本质是一个指针变量。
 int (*f) (int x); /* 声明一个函数指针 */
 f=func; /* 将func函数的首地址赋给指针f */
指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:
类型说明符 (*函数名)(参数)
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。
指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
例如:
void (*fptr)();
把函数的地址赋值给函数指针,可以采用下面两种形式:
fptr=&Function;
fptr=Function;
取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
可以采用如下两种方式来通过指针调用函数:
x=(*fptr)();
x=fptr();
第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子:
void (*funcp)();
void FileFunc(),EditFunc();
main()
{
funcp=FileFunc;
(*funcp)();
funcp=EditFunc;
(*funcp)();
}
void FileFunc()
{
printf(FileFunc\n);
}
void EditFunc()
{
printf(EditFunc\n);
}
程序输出为:
FileFunc
EditFunc
主要的区别是一个是指针变量,一个是函数。在使用是必要要搞清楚才能正确使用
二、指针的指针
指针的指针看上去有些令人费解。它们的声明有两个星号。例如:
char ** cp;
如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针,依次类推。当你熟悉了简单的例子以后,就可以应付复杂的情况了。当然,实际程序中,一般也只用到 二级指针,三个星号不常见,更别说四个星号了。
指针的指针需要用到指针的地址。
char c='A';
char *p=&c;
char **cp=&p;
通过指针的指针,不仅可以访问它指向的指针,还可以访问它指向的指针所指向的数据。下面就是几个这样的例子:
char *p1=*cp;
char c1=**cp;
你可能想知道这样的结构有什么用。利用指针的指针可以允许被调用函数修改局部指针变量和处理指针数组。
void FindCredit(int **);
main()
{
int vals[]={7,6,5,-4,3,2,1,0};
int *fp=vals;
FindCredit(&fp);
printf(%d\n,*fp);
}
void FindCredit(int ** fpp)
{
while(**fpp!=0)
if(**fpp<0) break;
else (*fpp)++;
}
首先用一个数组的地址初始化指针fp,然后把该指针的地址作为实参传递给函数FindCredit()。FindCredit()函数通过表达式**fpp间接地得到数组中的数据。为遍历数组以找到一个负值,FindCredit()函数进行自增运算的对象是调用者的指向数组的指针,而不是它自己的指向调用者指针的指针。语句(*fpp)++就是对形参指针指向的指针进行自增运算的。但是因为*运算符高于++运算符,所以圆括号在这里是必须的,如果没有圆括号,那么++运算符将作用于二重指针fpp上。
三、指向指针数组的指针
指针的指针另一用法旧处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串。
char *Names[]=
{
Bill,
Sam,
Jim,
Paul,
Charles,
0
};
main()
{
char **nm=Names;
while(*nm!=0) printf(%s\n,*nm++);
}
先用字符型指针数组Names的地址来初始化指针nm。每次printf()的调用都首先传递指针nm指向的字符型指针,然后对nm进行自增运算使其指向数组的下一个元素(还是指针)。注意完成上述认为的语法为*nm++,它首先取得指针指向的内容,然后使指针自增。

c语言,在函数中创建的指针,在其他函数中能直接调用吗

1、在函数中创建的指针,具有局部性,在其他函数中不能直接调用。
2、可以通过地址传递方式(可以实现双向传递)在其他函数中使用。
不能啊,函数中定义的局部变量的出了大括号就被销毁了
呵呵,楼主说话被理解成了两种解释,关键看作用域了。其实楼上2为说的都没有错
比如
void f1()
{
int *p =.....;
f2(p);//这当然是允许的
}
再如:
void f3()
{
int *p2 =.....;
}
void f4()
{
p2 = NULL;//这显然是不允许的
}
能啊,在参数里调用指针其实只是用的只是地址,下面的程序就是调用数组a的首地址。
int reform(int *q,int n)
{....}
main()
{
int a[10],*p;
p=a;
reform(p,10);
}

c++的函数指针是怎么用的呀?

以前写的一个例子。。可能比较乱。。
// Pratice19.cpp : Defines the entry point for the console application.
/* void (*f)();//函数指针
void* f(); //函数返回指针
const int* //const指针
int * const //指向const的指针
const int* const //指向const的const指针
*/
#include "stdafx.h"
#include

#include

int max(int x, int y)

{

return x>y?x:y;

}

void FileFunc()

{

printf("FileFunc()\n");

}

void EditFunc()

{

printf("EditFunc()\n");

}

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

{

int i;

char *p;

p=str2;

阅读更多 >>>  strcpy(a,C语言中的strcpy(a,b)复制时是否将b中的空字符也复制进去?当a已经赋值的情况下

if(*str2==NULL)

{

printf("null") ;

};

do

{

*str2=*str1;

str1++;

str2++;

}while(*str1!=NULL);

return(p);

}

float *find(float(*pointer)[4], int n) //定义指针函数,形参pointer是指针指向包含4个元素的一维数组的指针变量,

{

float *pt;

pt = *(pointer+n); //pointer+1指向 score的第一行。*(pointer+1)指向第一行的第0个元素

return pt;

}

int add1(int a,int b)

{

return a+b;

}

int add2(int a,int b)

{

return a+b;

}

int main(int argc, char* argv[])

{

struct S

{

int i;

int *p;

};

S s;

int *p = &s.i;

p[0] = 1;

p[1] = 2;

s.p = p;

s.p[0] = 3;

s.p[1] = 4;

cout << p[0] << ' ' <
<s.i<<endl;
cout << &p[0] << ' ' << &s.i << endl;

cout << p[1] << ' ' << s.p << ' ' << &s.p[0] << endl;

cout << &p[1] <<' ' <<&s.p<<' '<<&s.p[1] << endl;

/*函数指针问题,就像数组是指向数组的第一个元素的常指针一样,函数名也是指向函数的指针,可以声明一个指向函数的指针变量,并且用这个指针来指向其它函数

float (**def)[10]; //def是一个二级指针,他指向的是一个一维数组的指针,数组的元素都是float型

double*(*gh)[10]; // gh是一个指针,他指向一个一维数组,数组元素都是double*型的

double(*f[10])(); //f是一个数组,他有10个元素,元素是函数的指针,指向的函数类型是无参,返回值是double型的函数

int*((*b)[10]); //和int*(*b)[10]是一样的,b是一个一维数组的指针

long (*fun)(int); //函数指针,指向函数的指针,这个指针的返回值是long ,所带的参数时是int ,

long *fun(int); //指针函数,是个带有整型参数返回长整型变量的指针的函数

int (*(*F)(int ,int))(int) //F是一个指向函数的指针,他指向这样一个函数(该函数参数为(int ,int),返回值为一个指针)

//,返回的这个指针指向的是另外一个函数(参数类型是int,返回值为int型的函数)

*/

//函数指针是指向函数的指针变量。

/* 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、

数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。

有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,

在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的声明方法为:

数据类型标志符 (指针变量名) (形参列表);

注1:“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,

后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

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

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

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

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

注2:函数括号中的形参可有可无,视情况而定。

*/

/*max()的入口地址赋给p,以后就可以用p用该函数,实际上p和max都指向同一个入口地址,不同就是p是一个指针变量,不像函数名称

那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用

它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。

*/

int max(int,int);

int (*f)(int,int) = &max; //函数指针

int a, b, c, d;

printf("please input three integer:\n");

scanf("%d %d %d",&a, &b, &c);

d = (*f)((*f)(a, b),c);

printf("三个数种最大值是%d\n",d);

//

void (*funcp)();

funcp = FileFunc; //先指向FileFunc

(*funcp)();

funcp = EditFunc; //再指向另一个函数

(*funcp)();

//

printf("please intput a interger again:\n ");

int i,j,k;

scanf("%d",&i);

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

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

printf("再连续输入9个数\n");

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

{

scanf("%d",&j);

i = (*fg)(i,j); /* 通过指针p调用函数f */

}

printf("The Max Number is:%d\n",i);

/*指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型

是某一类型的指针。

其定义格式如下所示:

返回类型标识符 *返回名称(形式参数表)

{ 函数体 }

返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,

它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是

函数本身而已,而整个函数相当于一个“变量”

*/

//

char *ch(char *,char *); //指针函数

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

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

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

//

float *find(float(*pionter)[4], int n);

static float score[][4] = {{78,45,34,90},{78,89,78,98},{45,32,89,78},{65,89,56,98}};

float *pt;

int m;

cout << "enter the number you want to find:" << endl;

cin >> m;

pt = find (score, m);

for (i = 0; i < 4; i++)

{

cout << *(pt+i) <<' '<
<endl;
}

/*关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。

第一种,标准方法:

分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。

根据分析:首先说明是一个数组:数组名[]

其次,要说明其元素的数据类型指针:*数组名[].

再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])().请注意,这里为什么要把“*数组名[]”用括

号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向

,那么 *数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组

的每一个元素是指针。

第二种,蒙骗法:

尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数方法是:用不带有括号和参数的函数名得到。

函数名相当于一个指向其函数入口指针常量。 那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。

那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。

*/

int num1 = 1;

int num2 = 2;

int num3 = 3;

int num4 = 4;

int (*ftr[2])(int a,int b);

ftr[0] = add1;

ftr[1] = add2;

printf("%d %d\n",ftr[0](num2,num1),ftr[1](num2,num4));

return 0;

}

如:

有一函数

void fun(void);//这是fun函数的声明

fun(){};//这是fun函数的调用

fun;//当只是函数的名字的时候就代表着函数入口的地址

这样,我们可以通过定义一个指针,然后使这个指针指向函数的入口,这样,我么就可以间接调用函数了。

具体例子

int main()

{void (*p)(int n);//声明函数指针的时候,参数的个数和类型必须和被指向的函数相同

void fun(int a);

p=fun;//指针p指向fun,fun是地址,正确

(*p)(0);//通过指针调用函数,与p();等价其中0是作为函数的参数

return 0;}

void fun(int a)

{}

因为函数的调用是需要一定的开销的,当一个函数经常被调用的时候,如果函数只有几行,这样我们可以通过inline函数来解决函数调用开销的问题。

但是如果函数有很多行且经常调用,那么,我们可以通过函数指针来解决函数调用开销的问题

函数指针就是指向函数入口的指针,就像数组名代表数组首地址一样,你详细的看看谭浩强的c语言。c++中函数指针貌似在MFC的RTTI中有用到。其他的没什么啊,c++最重要的是继承、多态,和泛型设计啊。

简单点说,就是你可不是事先指定调用哪个函数,留个指针在那,你以后想调用哪个函数,只需给那人个指针赋值就可以了

函数指针,即指向函数的指针。

1. 定义

每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。

2. 语法

指向函数的指针变量的一般定义形式为:

数据类型 (*指针变量名)(参数表);

3. 说明

1) 函数指针的定义形式中的数据类型是指函数的返回值的类型。

2) 区分下面两个语句:

int (*p)(int a, int b); //p是一个指向函数的指针变量,所指函数的返回值类型为整型

int *p(int a, int b); //p是函数名,此函数的返回值类型为整型指针

3) 指向函数的指针变量不是固定指向哪一个函数的,而只是表示定义了一个这样类型的变量,它是专门用来存放函数的入口地址的;在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。

4) 在给函数指针变量赋值时,只需给出函数名,而不必给出参数。

如函数max的原型为:int max(int x, int y); 指针p的定义为:int (*p)(int a, int b); 则p = max;的作用是将函数max的入口地址赋给指针变量p。这时,p就是指向函数max的指针变量,也就是p和max都指向函数的开头。

5) 在一个程序中,指针变量p可以先后指向不同的函数,但一个函数不能赋给一个不一致的函数指针(即不能让一个函数指针指向与其类型不一致的函数)。

如有如下的函数:int fn1(int x, int y); int fn2(int x);

定义如下的函数指针:int (*p1)(int a, int b); int (*p2)(int a);



p1 = fn1; //正确

p2 = fn2; //正确

p1 = fn2; //产生编译错误

6) 定义了一个函数指针并让它指向了一个函数后,对函数的调用可以通过函数名调用,也可以通过函数指针调用(即用指向函数的指针变量调用)。

如语句:c = (*p)(a, b); //表示调用由p指向的函数(max),实参为a,b,函数调用结束后得到的函数值赋给c。

7) 函数指针只能指向函数的入口处,而不可能指向函数中间的某一条指令。不能用*(p+1)来表示函数的下一条指令。

8) 函数指针变量常用的用途之一是把指针作为参数传递到其他函数

实例:

#include

阅读更多 >>>  指针函数怎么调用,求指针函数的使用!!

using namespace std; #include

int max(int x, int y); //求最大数 int min(int x, int y); //求最小数 int add(int x, int y); //求和 void process(int i, int j, int (*p)(int a, int b)); //应用函数指针 int main() { int x, y; cin>>x>>y; cout<<"Max is: "; process(x, y, max); cout<<"Min is: "; process(x, y, min); cout<<"Add is: "; process(x, y, add); getch(); return 0; } int max(int x, int y) { return x > y ? x : y; } int min(int x, int y) { return x > y ? y : x; } int add(int x, int y) { return x + y; } void process(int i, int j, int (*p)(int a, int b)) { cout<
<p(i, j)<<endl; }

</endl;
</s.i<<endl;

C语言调用函数指针

不好的编码规范。
函数声明最好在main函数的前面。
老师的代码定义的swap函数传入的形参是指针变量,是固定的4个字节,比你的代码传值 程序运行更快。
函数只用来实现相应功能,这样才可以实现代码复用,不要在里面写输出语句,这样代码会大大减少复用性。
首先函数声明放在main函数外,
其次zhizhen调用时,括号内不加*
最后指针函数内部,你的是传入值,你老师的是传入指针
你的zhizhen函数实际上不会交换 ab值,因为传值是传入副本
只有传入指针才会交换
你的程序实现不了交换的功能,因为:
void zhizhen(int a,int b)
传递的参数int a,int b为值传递,也就是系统会用两个临时变量承载你传递的变量的值,而不会把变量本身传递过去,也就是在函数中的交换行为无法传递到函数调用处。
解决方法有两个,
其一:使用指针,就是你老师的方法
其二:使用引用,也可以实现
一些建议:
zhizhen函数声明应该放在main()外面,并且是在main()前面,因为C语言是顺序执行,执行main()前它必须要知道zhizhen这个函数已经存在;
实际上你的zhizhen函数执行完了,a和b并不会交换。因为参数不是指针时,传入的只是一个值,是一个副本,对于main里的ab并没有影响,而你这个看起来结果相同是因为你的输出printf写在了zhizhen里。一般学习指针就是要让你知道指针对外部的影响。
尽量不要用拼音作为函数名,变量名。
指针还需要继续加深,数据都是存储在内存中,指针*p取的是里面的数据,就是值,而指针的地址就是p是取的地址。
这道编程,关键价值,体现传址对实参的影响。
你的写法不算错,只是函数写错了。
--你函数调用那里,传的参数是指针型也就是地址(zhizhe(*arr,*brr);)。
--而你函数定义和申明,参数都是int型,类型不匹配。
你和老师最大的区别:
--你的写法打印输出是写在调用函数内的,用的是函数的局部变量,体现不出传址的作用。
--老师的写法打印是在调用之后主函数中打印的,用的是实参,可以清楚看出,传址到函数,值改变后,实参值也改变。
另外你和老师写的函数作用也不一样:
--你的写法,比较大小是在子函数内部,那么子函数就具有比较功能。
--老师写法,比较写在主函数中,子函数只是单纯交换。
并不是不规范的问题,你子程序写法只能在子程序中输出正确的数据,而在主函数中无法得到交换过的x和y的值。参考程序运用指针让子程序去读写a和b的值,在子程序执行完成后,a和b的值确实得到了交换。
你的程序中子程序采用的不是指针类型参数,这样子程序无法将交换过后的值传回来。

C语言函数指针怎么用?

有函数: int fun(int a,int b);\x0d\x0a要定义指向该函数的指针\x0d\x0a对比指向 int a; 的指针\x0d\x0aint *p; p = &a;\x0d\x0ap的定义是怎么来的?\x0d\x0a首先要保证p是一个指针类型\x0d\x0a写下(*p),\x0d\x0a然后,考虑下p的基类型,\x0d\x0ap的基类型就是变量a的类型int\x0d\x0a将int 放在(*p)前面就行了\x0d\x0aint (*p); \x0d\x0a括号可以省略,就成了 int *p;\x0d\x0a\x0d\x0a同理\x0d\x0a想要实现 pf = &fun;\x0d\x0a(*pf) 将pf定义为一个指针,\x0d\x0a将fun的类型作为pf的基类型\x0d\x0afun相当于一个 int (int a,int b)类型的量\x0d\x0aint (int a,int b) (*pf);\x0d\x0a基类型中有圆括号和中括号要后移\x0d\x0aint (*pf)(int a,int b) ;//括号不能省略\x0d\x0apf = &fun;\x0d\x0a调用时\x0d\x0a(*pf)(3,4); pf(3,4)都可以

网站数据信息

"函数指针的调用,当一个函数的返回值为指针类型时如何调用"浏览人数已经达到22次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:函数指针的调用,当一个函数的返回值为指针类型时如何调用的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!