c語言中的函數指針定義法?函數指針和指針函數是兩個很容易混淆的概念,可以這樣增直觀理解:函數指針,是一個指針,一個指向函數基地址的指針,由此指針可以進行函數調用;指針函數是一個函數,一個返回指針值的函數,下面我們就來說一說關于c語言中的函數指針定義法?我們一起去了解并探讨一下這個問題吧!
c語言中的函數指針定義法
函數指針和指針函數是兩個很容易混淆的概念,可以這樣增直觀理解:函數指針,是一個指針,一個指向函數基地址的指針,由此指針可以進行函數調用;指針函數是一個函數,一個返回指針值的函數。
1 指針函數返回指針類型的函數簡稱指針函數。如用“TypeName"表示某一個數據類型,則“TypeName *pValue”表示定義一個返回TypeName類型的指針函數和一個指針變量pValue,而且這個指針變量必須正确初始化。假設這個指針變量不是通過參數表傳遞,而是在函數中産生,則可以表示為:
TypeName * FunName(參數表)
{
TypeName * pValue;
//函數體包括正确初始化指針變量pValue
//函數體
return pValue;
}
一個簡單實例的代碼:
//返回結構及結構指針的例子
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
//定義一個全局的結構體
struct LIST{
int a,b;
}d[3],*p;
//返回結構值
struct LIST make1(int x, int y)
{
struct LIST temp;
temp.a=x;
temp.b=y;
return temp;
}
//返回結構指針
struct LIST *make2(int x, int y)
{
struct LIST *temp;
temp=(struct LIST *)malloc(sizeof(struct LIST));
temp->a=x;
temp->b=y;
return temp;
}
int main()
{
int i;
d[0]=make1(215, 512);
p=make2(815,518);
d[1]=*p;
d[2]=d[0]; //結構可以整體賦值
for(i=0;i<3;i )
printf("d[%d].a=%d,d[%d].b=%d\n", i,d[i].a,i,d[i].b);
system("pause");
return 0;
}
運行結果:
d[0].a=215,d[0].b=512
d[1].a=815,d[1].b=518
d[2].a=215,d[2].b=512
假設函數的參數表中有“TypeN *”類型的參數value,則可以表示為如下形式:
TypeName FunName(TypeName *value, 其他參數表)
{
//函數體
return value;
}
一個簡單實例:
#include <stdlib.h>
//将結構指針作為返回值的例子。
#include <stdio.h>
struct LIST{
int a,b;
}d[3], b, *p;
struct LIST make(int , int); //返回結構的函數
struct LIST *change (struct LIST*, struct LIST [ ]); //返回結構的指針
void disp(struct LIST [ ]); //使用結構參數
int main()
{
d[0]=make(215,512);
d[1]=make(815,518);
d[2]=make(618,816);
p=&b; //初始化指針p
p=change(p,d); //表達式調用
disp(d);
printf("b.a=%d\t\tb.b=%d\n", b.a, b.b);
printf("p->a=%d\t\tp->b=%d\n", p->a, p->b);
system("pause");
return 0;
}
struct LIST make(int x, int y)
{
struct LIST temp;
temp.a=x;
temp.b=y;
return temp;
}
void disp(struct LIST d[ ])
{
int i;
for(i=0;i<3;i )
printf("d[%d].a=%d\td[%d].b=%d\n", i,d[i].a,i,d[i].b);
}
//将傳遞的一個結構參數作為函數的返回值
struct LIST* change(struct LIST *b,struct LIST d[ ])
{
b->a=d[0].a;
b->b=d[2].b;
return b;
}
運行結果:
d[0].a=215 d[0].b=512
d[1].a=815 d[1].b=518
d[2].a=618 d[2].b=816
b.a=215 b.b=816
p->a=215 p->b=816
2 函數指針指針變量可以指向整型變量、字符變量及字符串、浮點變量和數組。其實,指針變量也可以指向一個函數。因為盡管函數本身不是一個變量,但它在内存中仍然有其物理地址。在編譯過程中,原代碼被轉換成目标代碼,函數的入口地址也同時确立,所以就能夠将函數的入口地址賦給指針變量。程序調用函數,也就是機器語言的"CALL"指向了這個入口點。因為指向函數的指針實際上包含了函數的入口點的内存地址,所以賦給指針變量的地址就是函數的入口地址,從而該指針就可以用來代替函數名。這一特性也使得函數可以作為實參傳遞給其他函數。
通過函數指針變量可以完成對函數的調用。其原理是通過把一個函數(函數名)賦給一個函數指針變量,然後又通過該函數指針變量來完成對函數的引用。
一個小實例:
使用函數指針輸出多項式x³-4x 6和x²-3x在區間[-1,1]增長步長為0.1時的所有結果。
#include <stdlib.h>
#include <stdio.h>
double f1(double x);
double f2(double x);
//double (*p)(double);
#define STEP 0.1
int main( )
{
int i;
double x;
double (*p)(double); //double (*p)(double)與double (*p)( )等效
for ( i=0; i<2; i )
{
printf("第%d個方程:\n",i 1);
if ( i==0)
p = f1;
//p = f1(x);
else
p = f2;
for( x = -1; x <= 1; x = STEP)
printf("%f\t%f\n", x, (*p)(x));
}
system("pause");
return 0;
}
//函數 f1
double f1(double x)
{ return ( x*x*x - 5*x -4);}
// 函數f2
double f2(double x)
{return( x*x - 3*x 2);}
運行結果:
第1個方程:
-1.000000 0.000000
-0.900000 -0.229000
-0.800000 -0.512000
-0.700000 -0.843000
-0.600000 -1.216000
-0.500000 -1.625000
-0.400000 -2.064000
-0.300000 -2.527000
-0.200000 -3.008000
-0.100000 -3.501000
-0.000000 -4.000000
0.100000 -4.499000
0.200000 -4.992000
0.300000 -5.473000
0.400000 -5.936000
0.500000 -6.375000
0.600000 -6.784000
0.700000 -7.157000
0.800000 -7.488000
0.900000 -7.771000
1.000000 -8.000000
第2個方程:
-1.000000 6.000000
-0.900000 5.510000
-0.800000 5.040000
-0.700000 4.590000
-0.600000 4.160000
-0.500000 3.750000
-0.400000 3.360000
-0.300000 2.990000
-0.200000 2.640000
-0.100000 2.310000
-0.000000 2.000000
0.100000 1.710000
0.200000 1.440000
0.300000 1.190000
0.400000 0.960000
0.500000 0.750000
0.600000 0.560000
0.700000 0.390000
0.800000 0.240000
0.900000 0.110000
1.000000 0.000000
語句double (*p)( );僅僅說明p是一個指向函數的指針變量,此函數帶回實型的返回值。但這并不是固定指向哪一個函數的,而隻是表示定義了這樣一個類型的變量,專門用來存儲函數的入口地址。在程序中把哪一個函數的地址賦給它,它就指向哪一個函數。
函數指針聲明相對于函數聲明,多了“(*)”符号,即多了一對圓括号和一個星号。
如果再增加一對中括号和一個數字,如double (*p[3])( );則成了一個函數指針數組變量,也就是擁有了三個函數指針,分别是p[0]、p[1]、p[2]。
函數指針還可以用作函數參數或函數返回值,具體内容請見:C|函數指針做為函數參數或函數返回值。
-End-
,