程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 我也要學C語言-第六章:變量在內存中的地址與布局

我也要學C語言-第六章:變量在內存中的地址與布局

編輯:關於C語言

 今天一大早我學習了這2個函數,printf是格式化輸出到標准輸出設備(一般指屏幕);scanf呢是通過標准輸入設備(一般指鍵盤)輸入一組數據。其實這兩個函數的通過幾個小時的練習,掌握它並不難,可是呢!我發現了1個問題,就是scanf的時候,為什麼後面的參數變量前為什麼有一個&(取地址符)!!!而printf裡面的變量前卻沒有呢?!我這裡舉個例子:

#include <stdio.h>

int main(void)
{
int x, y;
y = (int)&x;

scanf("%d,%d", &x, y);
    printf("%d,%08x", x, y);
return (0);
}
輸出結果:123,321
         321,0012ff44為什麼會出現這樣的結果呢!因為啊!scanf後面的參數要的是地址,我把x取地址然後強制把這個地址解釋成整型數再賦值給y!這樣,y就放的x的地址,然後scanf默認把y當成地址去解釋,這樣的話,&x和y表示的同一個地址。這樣你輸入123,321,結果x就輸出的就是第二次你輸入的321,0012ff44呢自然也就是x的地址。同理,此程序也這樣寫:
#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>

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會得到什麼結果呢!好的!馬上編譯輸出下結果為:
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的調試器調試調試就知道啦!我覺得調試器真的太好了!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved