/*Please input the expression a+(-*/)b:

目前累計服務客戶成百上千家,積累了豐富的產(chǎn)品開發(fā)及服務經(jīng)驗。以網(wǎng)站設計水平和技術(shù)實力,樹立企業(yè)形象,為客戶提供成都做網(wǎng)站、成都網(wǎng)站設計、網(wǎng)站策劃、網(wǎng)頁設計、網(wǎng)絡營銷、VI設計、網(wǎng)站改版、漏洞修補等服務。成都創(chuàng)新互聯(lián)公司始終以務實、誠信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過對領先技術(shù)的掌握、對創(chuàng)意設計的研究、對客戶形象的視覺傳遞、對應用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進步。
9/3
9 / 3 = 3
Press any key to continue
*/
#include?stdio.h
int?add(int?x,int?y)?{
printf("%d?+?%d?=?",x,y);
return?x?+?y;
}
int?sub(int?x,int?y)?{
printf("%d?-?%d?=?",x,y);
return?x?-?y;
}
int?mult(int?x,int?y)?{
printf("%d?*?%d?=?",x,y);
return?x?*?y;
}
int?dev(int?x,int?y)?{
printf("%d?/?%d?=?",x,y);
return?x?/?y;
}
void?main()?{
int?(*funp)(int,int);
char?op;
int?x,y;
printf("Please?input?the?expression?a+(-*/)b:\n");
scanf("%d",x);
scanf("%c",op);
scanf("%d",y);
switch(op)?{
case?'+'?:?funp?=?add;?break;
case?'-'?:?funp?=?sub;?break;
case?'*'?:?funp?=?mult;?break;
case?'/'?:?funp?=?dev;?break;
default?:?printf("Operator?is?illegal;\n");
}
printf("%d\n",funp(x,y));
getchar();
}
你的程序中有兩個錯誤:
[1]嚴重錯誤!
錯誤點:四個函數(shù)都沒有定義返回值的類型;
后果:顯示為0或者出現(xiàn)錯誤提示。
修改:四個函數(shù)前都加上double(或者float),改成如:double add()樣子就可以了。
[2]一般錯誤。
錯誤點:聲明ab均為float類型,而在函數(shù)中參數(shù)的類型又聲明為int,如add(int a,int b);
后果:調(diào)用參數(shù)不同類型,會造成計算結(jié)果錯誤。
修改:把函數(shù)聲明內(nèi)部的int都改成float即可,如:double add(float a,float b)
修改后的程序如下(盡量保持你程序的原貌)
#include?"stdio.h"
double?add(float?x,float?y)
{???
printf("sum=");??
return(x+y);
}
double?jf(float?x,float?y)
{???
printf("cha=");??
return(x-y);
}
double?cf(float?x,float?y)
{???
printf("ji=");??
return(x*y);
}
double?chu(float?x,float?y)
{???
printf("shang=");??
return(x*1.0/y);
}
void?main()
{
float?a,b;?
char?ch;?
scanf("%f%c%f",a,ch,b);?
switch(ch)
{
case?'+':printf("%f\n",add(a,b));break;?
case?'-':printf("%f\n",jf(a,b));break;
case?'*':printf("%f\n",cf(a,b));break;
case?'/':printf("%f\n",chu(a,b));break;
default?:printf("Error!\n");
}??
}
如果有什么問題請留言。
指針變量是有加減運算的,但是要注意以下幾點:
1.指針變量中存放的是地址值,也就是一個數(shù)字地址,例如某指針變量中的值是0x20000000,表示表示此指針變量存放的是內(nèi)存中位于0x20000000地方的內(nèi)存地址。指針變量可以加減,但是只能與整型數(shù)據(jù)加減,此時加減的含義并不是其地址值進行了加減,也就是說如果指針變量p的值是0x20000000,那么p=p+2;的值并不是0x20000002,并不是地址值的簡單相加,那么地址值加減多少是與指針指向的數(shù)據(jù)類型相關聯(lián)的,如果在32位的操作系統(tǒng)上,p是指向整型數(shù)據(jù)的指針變量,那么p=p+2之后,p的地址值變成0x20000008,也就說實際上地址值加了多少呢:sizeof(int)*2這么多。說明白點,我們加減的數(shù)字是以指針指向的數(shù)據(jù)類型為量度的,P+2表示p在內(nèi)存中前移兩個int的距離,如果p不是int類型,而是其他類型道理也是一樣。同樣指針與整型數(shù)據(jù)相減也是同樣的道理。
2.指針之間可以相減,但不可以相加:兩個同一類型的指針變量是可以相減的,他們的意義表示兩個指針指向的內(nèi)存位置之間相隔多少個元素(注意是元素,并不是字節(jié)數(shù)),例如對于int類型的指針p和p1. p1-p的意義表示他們之間相隔多少個int類型的元素。同樣對于其他類型的指針變量之間相減的意義也是一樣。 指針變量的自加和自減實際上是與整數(shù)1的加減運算。
3.指針之間可以比較大小。但是同樣也限于兩個相同類型的指針變量,不同類型的指針變量之間比較大小沒有任何意義。指針之間的大小比較的意義,表示在內(nèi)存中他們指向的位置的高低關系。
函數(shù)在內(nèi)存中有一個物理位置,而這個位置是可以賦給一個指針的。一零點函數(shù)的地址就是該函數(shù)的入口點。因此,函數(shù)指針可被用來調(diào)用一個函數(shù)。函數(shù)的地址是用不帶任何括號或參數(shù)的函數(shù)名來得到的。(這很類似于數(shù)組地址的得到方法,即,在只有數(shù)組名而無下標是就得到數(shù)組地址。)
怎樣說明一個函數(shù)指針變量呢 ?
為了說明一個變量 fn_pointer 的類型是"返回值為 int 的函數(shù)指針", 你可以使用下面的說明語句:
int (*fn_pointer) ();
為了讓編譯器能正確地解釋這句語句, *fn_pointer 必須用括號圍起來。若漏了這對括號, 則:
int *fn_pointer ();
的意思完全不同了。fn_pointer 將是一個函數(shù)名, 其返回值為 int 類型的指針。
2:函數(shù)指針變量
在C語言中規(guī)定,一個函數(shù)總是占用一段連續(xù)的內(nèi)存區(qū), 而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。 我們可以把函數(shù)的這個首地址 ( 或稱入口地址 ) 賦予一個指針變量, 使該指針變量指向該函數(shù)。然后通過指針變量就可以找到并調(diào)用這個函數(shù)。我們把這種指向函數(shù)的指針變量稱為 " 函數(shù)指針變量 " 。
函數(shù)指針變量定義的一般形式為:
類型說明符 (* 指針變量名 )();
其中 " 類型說明符 " 表示被指函數(shù)的返回值的類型。 "(* 指針變量名 )" 表示 "*" 后面的變量是定義的指針變量。 最后的空括號表示指針變量所指的是一個函數(shù)。
例如: int (*pf)();
表示 pf 是一個指向函數(shù)入口的指針變量,該函數(shù)的返回值 ( 函數(shù)值 ) 是整型。
下面通過例子來說明用指針形式實現(xiàn)對函數(shù)調(diào)用的方法。
int max(int a,int b)
{
if(ab)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);
}
從上述程序可以看出用,函數(shù)指針變量形式調(diào)用函數(shù)的步驟如下:
1. 先定義函數(shù)指針變量,如后一程序中第 9 行 int (*pmax)(); 定義 pmax 為函數(shù)指針變量。
2. 把被調(diào)函數(shù)的入口地址 ( 函數(shù)名 ) 賦予該函數(shù)指針變量,如程序中第 11 行 pmax=max;
3. 用函數(shù)指針變量形式調(diào)用函數(shù),如程序第 14 行 z=(*pmax)(x,y); 調(diào)用函數(shù)的一般形式為: (* 指針變量名 ) ( 實參表 ) 使用函數(shù)指針變量還應注意以下兩點:
a. 函數(shù)指針變量不能進行算術(shù)運算,這是與數(shù)組指針變量不同的。數(shù)組指針變量加減一個整數(shù)可使指針移動指向后面或前面的數(shù)組元素,而函數(shù)指針的移動是毫無意義的。
b. 函數(shù)調(diào)用中 "(* 指針變量名 )" 的兩邊的括號不可少,其中的 * 不應該理解為求值運算,在此處它只是一種表示符號。
3:指針型函數(shù)
前面我們介紹過,所謂函數(shù)類型是指函數(shù)返回值的類型。 在C語言中允許一個函數(shù)的返回值是一個指針 ( 即地址 ) ,這種返回指針值的函數(shù)稱為指針型函數(shù)。
定義指針型函數(shù)的一般形式為:
類型說明符 * 函數(shù)名 ( 形參表 )
{
…… /* 函數(shù)體 */
}
其中函數(shù)名之前加了 "*" 號表明這是一個指針型函數(shù),即返回值是一個指針。類型說明符表示了返回的指針值所指向的數(shù)據(jù)類型。
如:
int *ap(int x,int y)
{
…… /* 函數(shù)體 */
}
表示 ap 是一個返回指針值的指針型函數(shù), 它返回的指針指向一個整型變量。下例中定義了一個指針型函數(shù) day_name ,它的返回值指向一個字符串。該函數(shù)中定義了一個靜態(tài)指針數(shù)組 name 。 name 數(shù)組初始化賦值為八個字符串,分別表示各個星期名及出錯提示。形參 n 表示與星期名所對應的整數(shù)。在主函數(shù)中, 把輸入的整數(shù) i 作為實參, 在 printf 語句中調(diào)用 day_name 函數(shù)并把 i 值傳送給形參 n 。 day_name 函數(shù)中的 return 語句包含一個條件表達式, n 值若大于 7 或小于 1 則把 name[0] 指針返回主函數(shù)輸出出錯提示字符串 "Illegal day" 。否則返回主函數(shù)輸出對應的星期名。主函數(shù)中的第 7 行是個條件語句,其語義是,如輸入為負數(shù) (i0) 則中止程序運行退出程序。 exit 是一個庫函數(shù), exit(1) 表示發(fā)生錯誤后退出程序, exit(0) 表示正常退出。
應該特別注意的是函數(shù)指針變量和指針型函數(shù)這兩者在寫法和意義上的區(qū)別。如 int(*p)() 和 int *p() 是兩個完全不同的量。 int(*p)() 是一個變量說明,說明 p 是一個指向函數(shù)入口的指針變量,該函數(shù)的返回值是整型量, (*p) 的兩邊的括號不能少。
int *p() 則不是變量說明而是函數(shù)說明,說明 p 是一個指針型函數(shù),其返回值是一個指向整型量的指針,*p 兩邊沒有括號。作為函數(shù)說明, 在括號內(nèi)最好寫入形式參數(shù),這樣便于與變量說明區(qū)別。 對于指針型函數(shù)定義,int *p() 只是函數(shù)頭部分,一般還應該有函數(shù)體部分。
main()
{
int i;
char *day_name(int n);
printf("input Day No:/n");
scanf("%d",i);
if(i0) 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((n1||n7) ? name[0] : name[n]);
}
本程序是通過指針函數(shù),輸入一個 1 ~ 7 之間的整數(shù), 輸出對應的星期名。指針數(shù)組的說明與使用一個數(shù)組的元素值為指針則是指針數(shù)組。指針數(shù)組是一組有序的指針的集合。指針數(shù)組的所有元素都必須是具有相同存儲類型和指向相同數(shù)據(jù)類型的指針變量。
指針數(shù)組說明的一般形式為: 類型說明符 * 數(shù)組名 [ 數(shù)組長度 ]
其中類型說明符為指針值所指向的變量的類型。例如: int *pa[3] 表示 pa 是一個指針數(shù)組,它有三個數(shù)組元素, 每個元素值都是一個指針,指向整型變量。通常可用一個指針數(shù)組來指向一個二維數(shù)組。 指針數(shù)組中的每個元素被賦予二維數(shù)組每一行的首地址,因此也可理解為指向一個一維數(shù)組。圖 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;i3;i++)
printf("%d,%d,%d/n",a[i][2-i],*a[i],*(*(a+i)+i));
for(i=0;i3;i++)
printf("%d,%d,%d/n",*pa[i],p[i],*(p+i));
}
本例程序中, pa 是一個指針數(shù)組,三個元素分別指向二維數(shù)組 a 的各行。然后用循環(huán)語句輸出指定的數(shù)組元素。其中 *a[i] 表示 i 行 0 列元素值; *(*(a+i)+i) 表示 i 行 i 列的元素值; *pa[i] 表示 i 行 0 列元素值;由于 p 與 a[0] 相同,故 p[i] 表示 0 行 i 列的值; *(p+i) 表示 0 行 i 列的值。讀者可仔細領會元素值的各種不同的表示方法。 應該注意指針數(shù)組和二維數(shù)組指針變量的區(qū)別。 這兩者雖然都可用來表示二維數(shù)組,但是其表示方法和意義是不同的
可以啊指針其實也是一個內(nèi)存單元,存放了一個地址,變量也是一個內(nèi)存單元,存放了一個變量。減了就是吧指針這個內(nèi)存單云存放的地址減了。
嗯,沒錯,對指針的加減運算是以步長為單位的,不過這是對編譯器來講的。但是對于機器來講,指針也是二進制數(shù)據(jù),在機器內(nèi)對它們進行運算和一般的數(shù)據(jù)是一樣的,只是因為編譯器知道它們是指針,所以編譯器告訴你的是指針之間的步長。以下是一個測試的程序,應該能說明問題吧,僅供參考:
#includestdio.h
#includestdlib.h
void
main()
{
float
a[10],*p,*q;
p=a[4];
q=a[7];
printf("p:
0x%0xd\n",
p);
printf("q:
0x%0xd\n",
q);
printf("p-q:
%d\n",
p-q);
printf("p+3-p:
%d\n",
p+3-p);
system("pause");
}
新聞名稱:c語言指針函數(shù)調(diào)用加減 C語言中指針函數(shù)的用法
當前網(wǎng)址:http://chinadenli.net/article26/doojpjg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、標簽優(yōu)化、虛擬主機、網(wǎng)站改版、網(wǎng)站營銷、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)