轉自這裏
數據類型
1.
int add = 0x123456789;
int p = (int)add;
Q:add是什麼,add裏裝了什麼,p是什麼,p裏裝了什麼,*p是什麼,&p又是什麼
A:add 是一個整型變量,add裏面是0x123456789的二進制數;p是一個整型指針變量,p裏面是0x123456789的二進制數,不過是以地址的方式表現出來,代表地址0x123456789;p 是通過去訪問地址0x123456789這個地址數據(若試圖去打印,會出錯,這個地址不一定有權限去訪問);&p是取出整型指針變量p的地址。
2.
#define PI 3.14
(1)
int a = PI;
printf("%d\n", a);
(2)
printf("%d\n", PI);
Q:代碼有沒有問題
A:
(1) a 爲整型變量,PI爲宏定義的一個常量,3.14賦給a,可打印,結果爲3
(2)在預處理階段被替換成“printf(“%d\n” , 3.14)”,結果爲1374389535,浮點型的3.14在內存中的數據是以整型表現的
3.
const的只讀功能,可以定義const常量,具有不可變性
便於進行類型檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。例如: void f(const int i) { ………} 編譯器就會知道i是一個常量,不允許修改
可以避免意義模糊的數字出現,同樣可以很方便地進行參數的調整和修改。
可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。 還是上面的例子,如果在函數體內修改了i,編譯器就會報錯
提高了效率。 編譯器通常不爲普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成爲一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。
4.
Q:形參與實參的區別
A:
形參出現在函數定義中,在整個函數體內都可以使用, 離開該函數則不能使
實參出現在主調函數中,進入被調函數後(必須有確定的值),實參變量也不能使用
形參就是函數定義時候用的,實參是在函數調用時候用的
形參變量是屬於被調函數的局部變量,實參變量是屬於主調函數的局部變量
形參和實參的功能是作數據傳送。發生函數調用時, 主調函數把實參的值傳送給被調函數的形參從而實現主調函數向被調函數的數據傳送
5.
全局變量(外部變量)的使用方法
int a,b;
void f1()
{
….
}
float x,y;
{
….
}
int main()
{
….
}
a,b,x,y都在main主函數之外定義,所以都爲外部變量,即全局變量;但x,y定義在函數f1之後,f1內對x,y無說明,所以在f1內無效;a ,b定義於源程序最前面,所以在f1 ,f2, main 中不加說明也可使用
6.
n位的數據類型範圍爲什麼爲 -2^(n-1)~2^(n-1)-1
負數的-號無法存入內存,所以規定:將基本數據類型的最高位騰出來,用來存符號,最高位爲1 爲負數,最高位爲0 爲正數
但爲什麼正數的範圍會-1,因爲要平均分配負數與非負數。
二進制的最小數確實是1111111111111111只是二進制補碼的最小值纔是1000000000000000而補碼的1111111111111111是二迚制值的-1
7.
#define p_str2 char *
p_str1 s1, s2;
p_str2 s3, s4;
上述變量定義中,s1, s2 , s3 都被定義爲char * ,s4 則定義了char ,不是我們所預期的指針變量,根本原因是#define只是簡單的字符串替換而typedef則是爲一個類型起新名字
8.
char 1
short 2
long 4
int 4
float 4
double 8
9.
修飾函數
extern是全局變量聲明
只要聲明全局變量就默認 前面加extern(程序員可以不加,但編譯器默認加上)
若本文件 引用別的文件中的全局變量 一定要加上extern 聲明一下
例如 #include “my_Fun.c”
extern int b;//b是在my_Fun.c中聲明瞭的一個全局變量
這個extern 是個聲明他可以在任何地方聲明 引用了一個全局變量 (可以試試 在main()函數執行完之後聲明 也不會出錯)
這樣在 工程的總頭文件中就不需要考慮 先#include 哪個文件了
10.
地址常量與地址變量
數據存儲的空間中的數據可以被修改,這個空間稱爲變量,如果空間中的數據不能被修改,這個空間稱爲常量。地址常量就是地址不能被修改,就像一維數組中的數組名,是一個指針常量,不可被運算和不可被改變。地址變量就是地址能修改,就像一級指針,是一個指針變量,可以通過移動下標或移動指針來改變。