由於c語言以按值呼叫的方式將變元傳遞給函式,因而被呼叫函式不能直接更改呼叫函式中的變數的值。
例如下面的swap函式就是錯誤的:
swap(a,b);
void swap(int x,int y)//錯誤的函式定義
由於按值呼叫,上swap函式將不會影響呼叫它的程式中的變元的值,只交換臨時變數區中的對應的臨時拷貝的值。若想得到預期的結果,應該將所要交換值得指標傳遞給被呼叫函式swap,即:
swap(&a,&b);
void swap(int *px,int *py)
對應的圖形描述如下:
這個版本的getintt函式當遇到檔案結尾時返回e o f,當下乙個輸入不是乙個數字時返回0,當在輸入中包含乙個有意義的數字時返回乙個正數。
練習5-1 在上面的例子中,函式getint將後面不跟數字的乙個+或-視為0的有效表達方式。通過將+或-寫回輸入流的方法來解決這個問題。
假如輸入的為+d,則符號位sign=1;c=getch()後c=d,*pn=0,即getint函式返回0,然後將d壓入輸入堆疊,供下一次getint使用。
int getint(int *pn)
sign=(c=='-')?-1:1;/*positive or negative*/
if(c=='+'||c=='-')
} c=getch();/*get the next character*/
for(*pn=0;isdigit(c);c=getch())
*pn=10**pn+(c-'0');
*pn *=sign;
if(c!=eof)
ungetch(c);
return c;
}
思想是多取一位,判斷是否為數字,如果不是數字後者輸入結束eof就將其壓入輸入堆疊,然後將符號壓入輸入堆疊,並將其值返回,從而結束getint呼叫。
練習5-2 模仿函式g e t i n t的實現方法,寫乙個浮點轉換函式getfloat。getfloat函式返回值的型別是什麼?
int float(float *pn)
sign=(c=='-')?-1:1;/*positive or negative*/
if(c=='+'||c=='-')
c=getch();/*get the next character*/
for(*pn=0.0;isdigit(c);c=getch())
*pn=10.0**pn+(c-'c'); //interger
if(c=='.')
c=getch();
for(power=1.0;isdigit(c);c=getch()) //fractional
*pn *=sign/power; //final number
if(c!=eof)
ungetch(c);
return c;
}
返回值為int型,因為返回eof或浮點數後邊的字元的ascii值,應該為int型。 5 指標與函式
c語言中值傳遞的本質是,當呼叫被調函式時,被調函式會在自己的函式棧中開闢相同型別的形參空間,並且將傳遞過來的值寫入形參空間儲存。傳遞位址和普通傳參沒有本質的區別。傳遞位址和普通傳參都是值傳遞,實參是數值,也可以是變數。數值沒有普通值傳遞,因為普通值傳遞需要的形參空間大,效率低,所以只有位址傳遞。四種...
指標及其應用3 指標與函式
指標作為函式引數指標可以作為函式的引數。在函式章節中,我們把數字作為引數傳入函式中,實際上就 是利用了傳遞指標 即傳遞陣列的首位址 的方法。通過首位址,我們可以訪問陣列中的任 何乙個元素。對於指向其他型別變數的指標,我們可以用同樣的方式處理。例如,我們編寫如下乙個函式,用於將兩個整型變數的值交換。v...
C語言(九) 指標(3)指標與const
表示一旦得到了某個變數的位址,不能再指向其他變數 int i 0 int const q i q是 const q 20 ok q error表示不能通過指標去修改這個變數 int i 0 int j const int p i const int p 等同於 int const p p 20 er...