1. c語言,指針函數的程序,能舉個簡單點的例子嗎越簡單越好啊
#include <stdio.h>
/*求a+b*/
int plus(int a, int b) { return a + b; }
/*求a-b*/
int minus(int a, int b) { return a - b; }
/*求a*b*/
int multiply(int a, int b) { return a * b; }
/*求a/b*/
int divide(int a, int b) { return a / b; }
typedef int (*FUN)(int,int); /*定義基本四則運算的標准形式*/
char op[]="+-*/"; /*四則運算的符號*/
FUN fun[]={&plus, &minus, &multiply, ÷};/*四則運算的函數指針*/
/*下面的程序演示了如何用一個通用的函數指針連續處理多種不同的函數運算*/
int main(void)
{
int a = 6, b = 3, i = 0;
for(i = 0; i < 4; i++)
printf("%d %c %d = %d\n", a, op[i], b, (*(fun + i))(a,b));
return 0;
}
/*運行結果:
6 + 3 = 9
6 - 3 = 3
6 * 3 = 18
6 / 3 = 2
上面的程序說明,如果你有很多種類似的操作,形式上都一致,只不過內容有所不同,那麼你可以用函數指針去代替這些函數,這樣有時候會很方便
*/
2. c語言函數指針
#include "stdio.h"
int max(int x,int y)
{
return x>y?x:y;
}
void main()
{
int a=1,b=2;
int (*fun)(int,int);
fun = max;
// 下邊兩行結果一樣
printf("call max=%d\n", fun(a,b)); // 調用max()
printf("call max=%d\n", (*fun)(a,b)); // 調用max()
// 下邊四行結果一樣
printf("max address:%p\n", max); // 函數地址
printf("max address:%p\n", &max); // 函數地址
printf("max address:%p\n", fun); // 函數指針
printf("max address:%p\n", *fun); // 函數指針
}
3. c語言的函數指針舉個例子
函數指針 就是指向函數的指針
比如
voidpr_int(inta)//函數
{
printf("%d ",a);
}
voidfunc(void(*p)(int),intm)//函數指針做參數
{
p(m);//調用函數指針
}
intmain()
{
func(pr_int,100);
return0;
}
4. c語言,指針函數的應用,能舉個簡單點的例子嗎越簡單越好啊
int
(*p)(參數表列)這個是定義一個指向函數的指針,返回值為整型。比如int
max(int
a,int
b)將max換成(*p)
即可,p里放的是max函數的入口地址,所以,此時的p做自加自減等運算無意義。不能用*(p+1)表示函數的下一條指令。
int
*p()是函數,此函數的返回值是個指向整型變數的指針變數。
***************************************************
以上是你需要的,下面是一些其它相關容易混淆的:
int
*p[n]:定義指針數組P,它由n個指向整型數據的指針元素組成。
int
(*p)[n]:P為指向含n個元素的一維數組的指針變數。
5. C語言中函數指針用法
函數在內存中有一個物理位置,而這個位置是可以賦給一個指針的。一零點函數的地址就是該函數的入口點。因此,函數指針可被用來調用一個函數。函數的地址是用不帶任何括弧或參數的函數名來得到的。(這很類似於數組地址的得到方法,即,在只有數組名而無下標是就得到數組地址。)
怎樣說明一個函數指針變數呢 ?
為了說明一個變數 fn_pointer 的類型是"返回值為 int 的函數指針", 你可以使用下面的說明語句:
int (*fn_pointer) ();
為了讓編譯器能正確地解釋這句語句, *fn_pointer 必須用括弧圍起來。若漏了這對括弧, 則:
int *fn_pointer ();
的意思完全不同了。fn_pointer 將是一個函數名, 其返回值為 int 類型的指針。
2:函數指針變數
在C語言中規定,一個函數總是佔用一段連續的內存區, 而函數名就是該函數所佔內存區的首地址。 我們可以把函數的這個首地址 ( 或稱入口地址 ) 賦予一個指針變數, 使該指針變數指向該函數。然後通過指針變數就可以找到並調用這個函數。我們把這種指向函數的指針變數稱為 " 函數指針變數 " 。
函數指針變數定義的一般形式為:
類型說明符 (* 指針變數名 )();
其中 " 類型說明符 " 表示被指函數的返回值的類型。 "(* 指針變數名 )" 表示 "*" 後面的變數是定義的指針變數。 最後的空括弧表示指針變數所指的是一個函數。
例如: int (*pf)();
表示 pf 是一個指向函數入口的指針變數,該函數的返回值 ( 函數值 ) 是整型。
下面通過例子來說明用指針形式實現對函數調用的方法。
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
main()
{
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:/n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
}
從上述程序可以看出用,函數指針變數形式調用函數的步驟如下:
1>. 先定義函數指針變數,如後一程序中第 9 行 int (*pmax)(); 定義 pmax 為函數指針變數。
2>. 把被調函數的入口地址 ( 函數名 ) 賦予該函數指針變數,如程序中第 11 行 pmax=max;
3>. 用函數指針變數形式調用函數,如程序第 14 行 z=(*pmax)(x,y); 調用函數的一般形式為: (* 指針變數名 ) ( 實參表 ) 使用函數指針變數還應注意以下兩點:
a. 函數指針變數不能進行算術運算,這是與數組指針變數不同的。數組指針變數加減一個整數可使指針移動指向後面或前面的數組元素,而函數指針的移動是毫無意義的。
b. 函數調用中 "(* 指針變數名 )" 的兩邊的括弧不可少,其中的 * 不應該理解為求值運算,在此處它只是一種表示符號。
3:指針型函數
前面我們介紹過,所謂函數類型是指函數返回值的類型。 在C語言中允許一個函數的返回值是一個指針 ( 即地址 ) ,這種返回指針值的函數稱為指針型函數。
定義指針型函數的一般形式為:
類型說明符 * 函數名 ( 形參表 )
{
…… /* 函數體 */
}
其中函數名之前加了 "*" 號表明這是一個指針型函數,即返回值是一個指針。類型說明符表示了返回的指針值所指向的數據類型。
如:
int *ap(int x,int y)
{
…… /* 函數體 */
}
表示 ap 是一個返回指針值的指針型函數, 它返回的指針指向一個整型變數。下例中定義了一個指針型函數 day_name ,它的返回值指向一個字元串。該函數中定義了一個靜態指針數組 name 。 name 數組初始化賦值為八個字元串,分別表示各個星期名及出錯提示。形參 n 表示與星期名所對應的整數。在主函數中, 把輸入的整數 i 作為實參, 在 printf 語句中調用 day_name 函數並把 i 值傳送給形參 n 。 day_name 函數中的 return 語句包含一個條件表達式, n 值若大於 7 或小於 1 則把 name[0] 指針返回主函數輸出出錯提示字元串 "Illegal day" 。否則返回主函數輸出對應的星期名。主函數中的第 7 行是個條件語句,其語義是,如輸入為負數 (i<0) 則中止程序運行退出程序。 exit 是一個庫函數, exit(1) 表示發生錯誤後退出程序, exit(0) 表示正常退出。
應該特別注意的是函數指針變數和指針型函數這兩者在寫法和意義上的區別。如 int(*p)() 和 int *p() 是兩個完全不同的量。 int(*p)() 是一個變數說明,說明 p 是一個指向函數入口的指針變數,該函數的返回值是整型量, (*p) 的兩邊的括弧不能少。
int *p() 則不是變數說明而是函數說明,說明 p 是一個指針型函數,其返回值是一個指向整型量的指針,*p 兩邊沒有括弧。作為函數說明, 在括弧內最好寫入形式參數,這樣便於與變數說明區別。 對於指針型函數定義,int *p() 只是函數頭部分,一般還應該有函數體部分。
main()
{
int i;
char *day_name(int n);
printf("input Day No:/n");
scanf("%d",&i);
if(i<0) exit(1);
printf("Day No:%2d-->%s/n",i,day_name(i));
}
char *day_n
ame(int n)
{
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((n<1||n>7) ? name[0] : name[n]);
}
本程序是通過指針函數,輸入一個 1 ~ 7 之間的整數, 輸出對應的星期名。指針數組的說明與使用一個數組的元素值為指針則是指針數組。指針數組是一組有序的指針的集合。指針數組的所有元素都必須是具有相同存儲類型和指向相同數據類型的指針變數。
指針數組說明的一般形式為: 類型說明符 * 數組名 [ 數組長度 ]
其中類型說明符為指針值所指向的變數的類型。例如: int *pa[3] 表示 pa 是一個指針數組,它有三個數組元素, 每個元素值都是一個指針,指向整型變數。通常可用一個指針數組來指向一個二維數組。 指針數組中的每個元素被賦予二維數組每一行的首地址,因此也可理解為指向一個一維數組。圖 6—6 表示了這種關系。
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0];
main()
{
int i;
for(i=0;i<3;i++)
printf("%d,%d,%d/n",a[i][2-i],*a[i],*(*(a+i)+i));
for(i=0;i<3;i++)
printf("%d,%d,%d/n",*pa[i],p[i],*(p+i));
}
本常式序中, pa 是一個指針數組,三個元素分別指向二維數組 a 的各行。然後用循環語句輸出指定的數組元素。其中 *a[i] 表示 i 行 0 列元素值; *(*(a+i)+i) 表示 i 行 i 列的元素值; *pa[i] 表示 i 行 0 列元素值;由於 p 與 a[0] 相同,故 p[i] 表示 0 行 i 列的值; *(p+i) 表示 0 行 i 列的值。讀者可仔細領會元素值的各種不同的表示方法。 應該注意指針數組和二維數組指針變數的區別。 這兩者雖然都可用來表示二維數組,但是其表示方法和意義是不同的
6. 論述C語言中指針的概念和作用,並舉例說明
1、指針概念:變數的地址(計算機內存位元組的編號)叫做指針,存放變數地址的變數叫指針變
量,
簡言之,指針是用來存放地址的。
2、作用:指向這個變數或數組的首地址,是變數的間接引用方式。其值如果改變,變數的值或數組元素的值也會跟著改變。程序對變數的操作實際上是對變數所在的存儲空間讀取和寫入數據。方便對變數的操作。
舉例說明:
int
a=3;/*定義一個整型變數a,並賦初值3*/
int
*p;/*定義一個指針變數P*/
p=&a;/*讓p指向a的首地址,也就是a的地址*/
程序為a分配一個2個位元組的存儲單元,假如2個位元組的地址分別為(ABCD1和ABCD2,唯一),那麼p裡面放的值就是ABCD1,不是3。這時可通過p直接引用a,實際上*p=3。以後不管a存放在內存中的哪個地方,只用通過調用p就可以引用a。這時如果令*p=4,則最後的a值也為4。對於數組,指針是指向數組的首地址。
7. C語言指針函數例題
在我的系統中運行你 的程序和你想的一樣,是8不是7.
string 1,string 2:
it's a boy
boy
offset 8 "boy"in"it's a boy"
所謂指針就是地址,只是指針會區別它是什麼指針,對應的數據佔多大內存。如subst,str都是char*類型的,他們是字元指針,所以他們指向的類型是字元。*str和str[0]的含義是一樣的,意思是取得首字元。在c語言中字元串就是用字元指針來表示的,對應的是「%s」,而加上了*,是取這個字元指針地址的內容,也就是一個字元,用「%c」表示。所以你列印的是字元串,就應該用%s。
8. c語言中函數指針是什麼 有什麼用 舉個實例
函數指針是指向函數的指針變數。 因而「函數指針」本身首先應是指針變數,只不過該指針變數指向函數。這正如用指針變數可指向整型變數、字元型、數組一樣,這里是指向函數。
函數指針有兩個用途:調用函數和做函數的參數。
函數指針的聲明方法為:
返回值類型 ( *指針變數名) ([形參列表]);
如:
int func(int x); /* 聲明一個函數 */
int (*f) (int x); /* 聲明一個函數指針 */
f=func; /* 將func函數的首地址賦給指針f */
或者使用下面的方法將函數地址賦給函數指針:
f = &func;
賦值時函數func不帶括弧,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。
下面的程序說明了函數指針調用函數的方法:
#include<stdio.h>
intmax(intx,inty){return(x>y?x:y);}
intmain()
{
int(*ptr)(int,int);
inta,b,c;
ptr=max;
scanf("%d%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
return0;
}
9. C語言中的函數指針
函數指針是定義一個指向函數的指針,形式為:void (*p)(void);
一般用法:
int fun1(int x);
int fun2(int x);
char fun3(int x);
int fun4(char x);
int main(void)
{
int (*p)(int x);
p=fun1; //指向fun1
p(2) //這時等價於fun1(2)
p=fun2; //也可以指向fun2
。
。
但是注意了,p=fun3;和p=fun4都是錯誤的,參數類型跟返回類型必須一樣。
至於指針函數,就是返回一個指針的函數。
基本形式:int *fun(void);
一般用法:
int *fun(void);
int main(void)
{
int *p=NULL; //聲明一個整型指針變數
p=fun(); //接收fun()的返回值
。
。
10. C語言 函數指針 的調用問題函數指針 怎麼用最好有例子。。
#include<stdio.h>
//定義類型fun_ptr,它是一個函數指針,指向的函數返回值為int,參數為int
typedefint(*fun_ptr)(int);
//fun1
intfun1(inta)
{
printf("callfun1,pram=%d,return%d+1 ",a,a);
returna+1;
}
//fun2
intfun2(inta)
{
printf("callfun2,pram=%d,return%d+2 ",a,a);
returna+2;
}
intmain(intargc,char*argv[])
{
inta=10;
ints=0;
//定義函數指針類型的變數p_fun
fun_ptrp_fun;
//指向fun1
p_fun=fun1;
//執行
s=p_fun(a);
printf("s=%d ",s);
//指向fun2
p_fun=fun2;
//執行
s=p_fun(a);
printf("s=%d
",s);
return0;
}
執行結果: