本文**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就是形參,只能是變數 ...