C語言程式設計的形參

2021-05-24 06:11:17 字數 2780 閱讀 5221

本文**http://www.songzhige.com/post/539.html

其實我對c語言程式設計中形參的使用,有時也是反暈,今天發現這篇文章,很好。

今天我們來剖析一道c語言的面試題,這道題除了考察對c語言函式形參的理解外,還有對++這類操作先加還是後加掌握程度的考察。

題目見下,可以直接用vc進行編譯執行

另外這道題也不是我出的,只是借來一用,不代表我完全認同其**規範格式。

#include

typedef structs;

void f(s s)

void fun(char *a,char *b)

void main(void)

;f(s);

printf("%d,%d/n",s.b,s.p);

p1=&c1;

p2=&c2;

fun(p1,p2);

printf("%c%c/n",c1,c2);

i=7&3+12;

p=array;

*(p++)=++i;

printf("%d/n",array[0]);

*(p)=i++;

*(p++)+=++i;

printf("%d/n",array[1]);

}執行結果分析:

void main(void)

;完成main()函式中的變數初始化

沒有特別需要注意的地方

假定結構s分配到的位址為s_main

f(s);

進入函式fun(),main()函式中結構s的起始位址s_main會傳給函式fun()

進入函式fun()會先另外分配一段空間s_f,並把s_main的值傳給s_f

void f(s s)

int a=1,b=2,c=3,d=4,m=2,n=2;

完成fun()函式中變數的初始化

(m=a>b)&&(n=c>d);

這裡考察對運算子以及運算優先順序別的理解

1.考察隊=和》《運算子優先順序的掌握程度,>《運算子優先順序比=高

所以(m=a>b)實際上為(m=(a>b)),先執行a>b操作,此時a=1,b=2,執行結果不為真,也就是m=0,m的值從2變為0

(n=c>d)同理,如果執行完(n=c>d)應該是n的值從2變為0

2.考察對&&運算子的理解,因為是條件與,如果前乙個條件不為真,就不會進行後面的處理

因為(m=a>b)得結果是m=0,所以&&不用再進行其右邊的運算,(n=c>d)沒有執行,n的值保持不變

printf("m=%d,n=%d/n",n,m);

到這裡m的值為0,n為2,正常輸出即可

留意這裡會額外考察面試者看題的細緻程度,輸出格式交換了m和n,最終輸出應為「m=2,n=0」

s.b+=1;

s.p+=2;

這裡的s實際上是s_f.b加1和s_f.p加2,s_main.b和s_main.p的值均保持不變

這就是之前我分析的形參的處理方法,可以將其當成函式的區域性函式,呼叫時從別處取到初始值

printf("%d,%d/n",s.b,s.p);

這裡考察的是對函式形參的理解

到這裡函式f()已經執行完返回到main()函式中,函式f()中使用的s_f已經釋放掉

所以輸出實際還是沒有改變的s_main.b和s_main.p,最終輸出為「1,2」

p1=&c1;

p2=&c2;

fun(p1,p2);

這裡也是考察隊函式形參的理解,不過這裡的引數是指標,所以結果會和前面的f()有所不同

void fun(char *a,char *b)

進入函式時候fun()也會分配兩個指標a_fun和b_fun

呼叫函式fun()會先將p1_main和p2_main的值傳遞給a_fun和b_fun

a=b;

這一句執行結果是a_fun從p1_main變為b_fun,也就是p2_main

(*a)++;

指標操作,此時a_fun等於p2_main,指向main()中c2所在的位址,實際結果為將c2所在的位址的內容加1

printf("%c%c/n",c1,c2);

因為前面將c2所在的位址的內容加了1,實際上就是c2內容已經被加了1,最終輸出應為「a,b」

對比函式f(),作為形參的p1和p2內容同樣沒有改變,但是函式fun()中改變了指標所指向位址的內容,從而改變了main()函式中的相應內容

i=7&3+12;

考察的是對運算子的掌握程度,實際等效為i=7&(3+12)=7

p=array;

取陣列的首位址給指標p

*(p++)=++i;

考察對i++和++i這類操作的理解,p先用再加,i先加再用,實際等效為下面

i=i+1;這裡i變為8

(*p)=i;這裡p指向array[0]的位址,所以array[0]變為8

p=p++;這裡p改指向array[1]的位址

printf("%d/n",array[0]);

最終輸出應為「8」

*(p)=i++;

i先用再加,實際等效為下面

(*p)=i;此時i依然為8,p指向array[1],所以array[1]變為8

i=i+1;i的內容變為9

*(p++)+=++i;

p先用再加,i先加再用,實際等效為下面

i=i+1;i的內容變為10

(*p)=(*p)+i;此時p指向array[1],i為10,array[1]為8,執行結果是array[1]變為18

p=p+1;

printf("%d/n",array[1]);

最終輸出應為「18」 }

python程式語言 函式的形參

python程式語言 函式的形參的講解 我在互動模式中寫了個函式 def adder args sum 0 for x in args.keys sum args x return sum 隨後呼叫,在互動模式中輸入 adder 為什麼結果不是我所預期的求和呢?而是報錯。traceback most...

C語言 形參和實參

c語言引數出現在兩個地方 函式定義處 函式呼叫處。函式定義處的引數是形式引數,只用在函式呼叫時才分配記憶體,函式呼叫完成後釋放記憶體,簡稱形參。函式呼叫處的引數是實際引數,可以是常量 變數 位址 指標 陣列 等。在函式呼叫時實參把值單向傳遞給形參,形參參與運算,實參本身不參與運算。在被調函式中,若只...

關於C語言形參和實參

1,對於剛接觸c語言的人對於形參和實參的理解可能不是那麼詳細,或者說很是模糊,但大體來說形參和實參的區別在於 形參只能是變數,而實參可以使變數,常量,也可以是表示式,關於變數,顧名思義,是乙個可變的量,我們通過乙個函式來理解 void add int a,int b 這裡a,b就是形參,只能是變數 ...