寫在前面:該篇針對c編譯器進行記錄,至於是否適用於c++編譯器,日後考證
目錄
變數的本質
通過變數來修改記憶體有幾種方法?
記憶體空間可以再取給別名嗎?
變數三要素(名稱、大小、作用域),變數的生命週期?
c語言中,函式是否可以看成一種資料型別嗎?
函式的三要素,名稱,引數,返回值;函式也是一種資料型別,只不過比較特殊而已。
變數是既能讀又能寫的記憶體物件,若一旦初始化後不能修改的物件則稱為常量。
理解指標關鍵在記憶體,當定義乙個int型別的變數,那麼記憶體會分配乙個四個位元組的位置。同理,定義乙個double型別的變數,記憶體會分配8個位元組的位置。
那麼,請問,變數的本質是什麼?答:是(一段連續)記憶體空間的別名(是乙個門牌號),變數千萬不要把變數往記憶體裡面理解,我們通過變數來操作記憶體。是通過變數往記憶體裡面讀寫資料,千萬不要理解為我們是往變數裡面讀寫資料,變數只不過是乙個記憶體的編號而已!
1)直接修改記憶體。
2)間接。記憶體有位址編號,拿到位址編號也可以修改記憶體。
兩種方法對比一下看,直接修改記憶體是通過設定變數的方式來進行的。而間接修改記憶體是通過直接用位址編號來進行修改的。
需要說明的是,在使用變數的方式來修改的時候,不可以把這個過程想象成把變數放入記憶體當中,而是,把變數當成乙個門牌號,具體的放入記憶體多大空間,是看這個變數的資料型別。
int a ;
int b;
char * p ;
//p = 0xaa11
a = 10; //1 直接賦值 //cpu裡面執行
printf("&a: %d\n", &a);
//2間接賦值 ==直接通過記憶體
*((int*)1245024) = 200; //提取出上面設定的變數a的位址編號為1245024
printf("a: %d\n", a); //如果a的值變了,說明間接賦值的方式也能修改記憶體。
執行如下,
當然,我可以把提取出來的變數a的位址編號賦值給p,然後,用p去間接的修改變數a的值,這個思路,就是指標的執行原理!,同樣這也是一種間接賦值。而且,這個例子也顯示出了指標和記憶體首位址所存在的關聯。
答:是可以的。(之前部落格記載的tpyedef是給資料型別進行取別名的,不是記憶體空間)
先解釋下,什麼叫變數的生命週期,假如說我在main函式裡面,定義了乙個變數,即我在main裡面去分配了一塊兒記憶體,那這塊兒記憶體空間在其他函式中可以用嗎?同理,在sub1函式裡面定義的乙個變數,在主調函式裡面能用嗎?(後續待補)
dm04 變數的本質
變數概念 變數本質 1 程式通過變數來申請和命名記憶體空間 int a 0 2 通過變數名訪問記憶體空間 一段連續 記憶體空間的別名 是乙個門牌號 修改變數有幾種方法?1 直接 2 間接。記憶體有位址編號,拿到位址編號也可以修改記憶體 於是橫空出世了!程式設計案例 3 記憶體空間可以再取給別名嗎?4...
變數的本質
變數是指其值可以變化的量。在計算機中,指令 資料都儲存於記憶體中。變數也需要儲存在記憶體中。在計算機中,每個變數都被分配了一塊記憶體空間,在這些空間儲存的就是變數的值。在源 中,每個變數都有變數名。實際上,編譯後的目標 裡並沒有變數名字,而是記錄著變數在記憶體空間中的位址。在c語言中,通過變數名可以...
變數的本質解析
資料型別 固定記憶體大小的別名 變數是既能寫又能讀的記憶體物件 而一旦初始換不能修改的物件叫常量 變數三要素 名稱,大小,作用域 變數的生命週期也是乙個重要的概念 可以看成編譯器何時自動釋放掉記憶體 可以看這篇 變數的本質 1.程式通過變數申請和命名記憶體空間 2.通過變數訪問記憶體空間 一段連續的...