變數的記憶體分析
位元組和地址
為了更好地理解變數在記憶體中的儲存細節,先來認識一下記憶體中的"位元組"和"地址"。
- 記憶體以"位元組為單位"
0x表示的是十六進位制,不用過於糾結,能看懂這些數字之間誰大誰小就行了
- 不同型別佔用的位元組是不一樣的,資料越大,所需的位元組數就越多
變數的儲存
- 所佔用位元組數跟型別有關,也跟編譯器環境有關
- 變數例項
int b = 10;
int a = 20;
- 記憶體由大到小定址,優先分配記憶體地址較大的位元組給變數。b的記憶體地址比a大
- 每個變數都有地址:第一個位元組的地址就是變數的地址
- 檢視記憶體地址:
int a;
printf("a的地址是:%p\n", &a);
- 注意
在變數未經初始化之前,不要嘗試使用變數的值
int a;
printf("a的值是:%d\n", a);
上面的寫法是不建議的
scanf函式
簡介
這也是在stdio.h中宣告的一個函式,因此使用前必須加入#include <stdio.h>。呼叫scanf函式時,需要傳入變數的地址作為引數,scanf函式會等待標準輸入裝置(比如鍵盤)輸入資料,並且將輸入的資料賦值給地址對應的變數
簡單用法
int age;
scanf("%d", &age);
- scanf函式時,會等待使用者的鍵盤輸入,並不會往後執行程式碼。scanf的第1個引數是"%d",說明要求使用者以10進位制的形式輸入一個整數。這裡要注意,個引數傳遞的不是age變數,而是age變數的地址&age,&是C語言中的一個地址運算子,可以用來獲取變數的地址
- 輸入完畢後,敲一下回車鍵,目的是告訴scanf函式我們已經輸入完畢了,scanf函式會將輸入的值賦值給age變數
其他用法
- 用scanf函式接收3個數值,每個數值之間用中劃線-隔開
scanf("%d-%d-%d", &a, &b, &c);
3個%d之間是用中劃線-隔開的,因此我們在每輸入一個整數後都必須加個中劃線-,比如這樣輸入,不然在給變數賦值的時候會出問題
- 注意:數值之間的分隔符是任意的,不一定要用中劃線-,可以是逗號、空格、星號*、井號#等等,甚至是英文字母
// 逗號,
scanf("%d,%d,%d", &a, &b, &c); // 輸入格式:10,14,20
// 井號#
scanf("%d#%d#%d", &a, &b, &c); // 輸入格式:10#14#20
// 字母x
scanf("%dx%dx%d", &a, &b, &c); // 輸入格式:10x14x20
- 用scanf函式接收3個數值,每個數值之間用空格隔開
scanf("%d %d %d", &a, &b, &c);
3個%d之間是用空格隔開的,我們在每輸入一個整數後必須輸入一個分隔符,分隔符可以是空格、tab、回車
注意
scanf的第一個引數中不要包含\n,比如scanf("%d\n", &a); 這將導致scanf函式無法結束
習題
提示使用者輸入兩個整數n,然後計算並輸出兩個整數的和
內容來源:傳智播客李明傑老師授課內容