今天一大早我學習了這2個函數,printf是格式化輸出到標准輸出設備(一般指屏幕);scanf呢是通過標准輸入設備(一般指鍵盤)輸入一組數據。其實這兩個函數的通過幾個小時的練習,掌握它並不難,可是呢!我發現了1個問題,就是scanf的時候,為什麼後面的參數變量前為什麼有一個&(取地址符)!!!而printf裡面的變量前卻沒有呢?!我這裡舉個例子:
#include <stdio.h>輸出結果:123,321
int main(void)
{
int x, y;
y = (int)&x;
scanf("%d,%d", &x, y);
printf("%d,%08x", x, y);
return (0);
}
#include <stdio.h>然後再看看這個程序:
int main(void)
{
int x, y;
y = (int)&x;
scanf("%d,%d", 0x0012ff44, y);
printf("%d,%08x", x, y);
return (0);
}
//123,321
//321,0012ff44
#include <stdio.h>這個程序如何同樣是輸入123,321會得到什麼結果呢!好的!馬上編譯輸出下結果為:
int main(void)
{
int x, y;
y = (int)&x - (int)&y;
scanf("%d,%d", 0x0012ff44, (int)&y+y);
printf("%d,%08x", x, y);
return (0);
}
123,321
321,00000004
這個又是什麼原因呢,是因為啊!(int)&x - (int)&y 表示x,y兩地址之差(因為x在高地址,y在低地址).其中0x0012ff44是X的地址(這個地址不是固定的),(int)&y+y表示,y的地址加上與x地址的差,所以結果也是x的地址。所以你輸入123,321結果為,321,00000004.
1:scanf後面的參數一定用地址值;具體為什麼要地址值,暫時我還不知道,我覺得呢!以後隨著學習的深入某個時候肯定會明白的(在深入理解計算機系統這本書上我大概看明白了1點點,是因為C語言的函數默認是值傳遞。如果不是給地址,這裡的輸入就會輸入到副本裡。我想呢!副本就相當於克隆人吧!把自己再克隆一個,然後呢!樣子一樣!別人再怎麼去揍那個克隆人,但是你自己不會痛,但是地址是唯一的,所以通過地址就可以找到你自己。而不是找到那個克隆人了,嘿嘿!應該是這樣吧。以後我明白更多了,就會解釋得更清楚了)。
2:在vc6.0中在main函數裡申請變量在內存中的布局是,先申請的在高地址,後申請的在低地址,連續申請的兩個變量在內存中也是連續排列的。這裡的知識通過VC6.0的調試器調試調試就知道啦!我覺得調試器真的太好了!