5 2指標與函式變元

2021-06-18 20:43:51 字數 1873 閱讀 8426

由於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...