1. 程式人生 > >C語言基礎知識2

C語言基礎知識2

一、基本資料型別
基本型別:又稱非構造性資料型別,其構造簡單,是由系統事先定義好的。
構造型別:又稱複雜資料型別,一般由程式設計師將其它資料型別(包括構造型別本身)按一定的規則構造而成。
指標型別:指標變數中只能存放地址(指標)。主要用於解決動態資料的建立、刪除和使用。
空型別: 主要用於資料型別的轉換和定義函式的型別。
C程式中的資料型別有常量和變數之分,分別屬於以上這些資料型別。在程式中用到的所有資料都必須先定義後使用。

型別識別符號 名字 取值範圍
char 字元型 ASCII字元程式碼
unsigned char 無符號字元型 0至255
signed char 有符號字元型 -27 ~ 27-1
int 整型 -231~ 231-1
unsigned int 無符號整型 0 ~ 232-1
signed int 有符號整型 同int
float 浮點 10-38~1038
double 雙精度型 10-308~10308

二、移植性:
在嵌入式開發中,考慮到程式碼的移植性,對於有符號(signed)與無符號(unsigned)一定要留心繫統預設的是無符號還是有符號;
為了解決此問題,通常使用typedef來重新指定宣告無符號還是有符號;
Typedef int sig_int;
Typedef unsigned int un_int;

三、
printf( )函式
功能:向終端輸出若干個任意指定型別的資料
格式:printf(“格式控制”,引數表列);

scanf( )函式
功能:等待使用者從鍵盤上輸入資料,然後按格式控制的要求對資料進行轉換後送到相應的變數地址中去
格式:scanf(“格式控制”,地址表列);
注意:資料輸入過程中產生的垃圾的處理方法!!
%s:用來輸入字串,將字串送到一個字元陣列中,在輸入時以非空白字元開始,以第一個空白字元結束。字串以串結束標誌’\0’作為最後一個字元。
%*:表示本輸入項在讀入後不賦給相應的變數(賦值抑制符)

四、定義與宣告
定義:建立一個變數,為其分配記憶體空間,併為它取名字(變數名),一個變數只能定義一次;變數是對程式中資料的儲存空間的抽象
宣告:告知編譯器,這個名字(變數名)已經匹配在一塊記憶體上了,但是並未為其分配記憶體;

五、變數的儲存型別(C的儲存類別有四種:auto、static、register和extern)
儲存空間的劃分
程式區:用於存放程式編譯後形成的可執行程式碼(執行時裝入)
靜態儲存區:用於存放程式中的靜態資料,如全域性變數等
動態儲存區:用於存放程式中的動態資料,如函式形參、區域性變數、函式呼叫時的現場保護和返回地址等

靜態資料: 說明在靜態儲存區中分配儲存單元並在程式執行過程中始終佔用該單元,直到程式結束才釋放;如:全域性變數、區域性靜態變數
動態資料: 在函式開始執行時分配動態儲存空間,函式結束時釋放這些空間。如:形參變數、區域性動態變數(auto register)、函式呼叫現場保護和返回地址等

六、程序空間的劃分
每個程序執行所需的空間稱為程序的虛擬地址空間。32位作業系統中該空間大小為4G(2^32)。分配方法一在硬碟上開闢虛擬記憶體空間,二採用軟體實現(寫時複製),在記憶體中給每個程序對映。1G=2 ^30

七、關鍵字
1、register:請求編譯器儘可能地將變數存在CPU內部暫存器中;
使用注意:
register修飾變數的型別必須是CPU所接受的;
register變數可能不是在記憶體中儲存,所以不能使用&來獲取變數的地址

2、static
全域性靜態變數:作用範圍侷限於它的原始檔,即只有本檔案內的程式碼才可以訪問它,變數名在其他檔案內不可見
區域性靜態變數:侷限於特定函式,但出作用域並不釋放,在函式體內的靜態變數的值也能夠維持
靜態函式:作用範圍僅限於它的原始檔,即只有本檔案內才能夠呼叫,函式名在其他檔案不可見
存放位置:程式開始時,存放在全域性資料區,結束時釋放空間,預設初始化值是0,使用時可改變其值;

3、const
const int *a; int const *a;
是一個指向const int型的指標,a所指向的記憶體單元不可改寫,所以(a)++是不允許的,但a可以改寫,所以a++是允許的。
int
const a;
a是一個指向int型的const指標,a是可以改寫的,但a不允許改寫。
int const * const a;
a是一個指向const int型的const指標,因此
a和a都不允許改寫
const給讀程式碼的人傳達非常有用的資訊。比如一個函式的引數是const char *,你在呼叫這個函式時就可以放心地傳給它char *或const char *指標,而不必擔心指標所指的記憶體單元被改寫
儘可能多地使用const限定符,把不該變的都宣告成只讀,這樣可以依靠編譯器檢查程式中的Bug,防止意外改寫資料。
const對編譯器優化是一個有用的提示,編譯器也許會把const變數優化成常量

4、extern:表明變數或函式的定義在別的檔案中,下面用到的這些變數或是函式是外來的,不是本檔案定義的,提示編譯器遇到此變數或函式時,在其他模組中尋找定義;
如果一個函式只能被本檔案中其它函式所呼叫,稱為內部函式(或靜態函式)。定義時在函式型別前加static。

5、struct:在網路協議、通訊控制、嵌入式系統的C/C++程式設計中,我們經常要傳送的不是簡單的位元組流(char型陣列),而是多種資料組合起來的一個整體,其表現形式是一個結構體
“結構體名”用作結構體型別的標誌;
花括弧內是該結構體中的各個成員,由它們組成一個結構體;在結構體內對各成員都應進行型別宣告;
“成員表列”也稱為域表。每個成員也稱為結構體中的一個域,成員名命名規則與變數名一樣;
每個成員名前的型別識別符號可以為已經定義了的任意型別,當然可以是結構體型別識別符號,即結構體成員也可以是另一個結構體變數。
此處只是構造出一個新的型別,並沒有定義該型別的變數,因此在記憶體中並沒有開闢任何儲存空間;
在程式中可以定義多個結構體型別,不同結構體型別用不同的結構體名來區分。
①引用形式:結構體變數名. 成員名
“.”是成員運算子,在所有的運算子中優先順序最高。
②不能將一個結構體變數作為一個整體進體輸入輸出,只能對結構體中的各個成員分別進行輸入輸出。
③不能用指向結構體變數的指標指向該結構體變數的某個成員。
④訪問結構體成員變數的三種方法:
stu.num、stu.name、stu.score
(*p).num、(*p).name、(p).score
p->num、p->name、p->score
“->”為指向運算子,是優先順序最高的運算子;
成員運算子“.”的優先順序高於指標運算子“
”,因此採用 “(*p).成員名” 形式時,括號不能省略;
在定義結構體變數的同時,可以進行初始化
結構體變數的各個初值用花括號{ }括起來,大括號內各個成員變數的值之間用逗號分隔,其值必須與成員變數一一對應,且資料型別應與成員變數一致。

6、union:當多個基本資料型別或複合資料結構要佔用同一片記憶體時,我們要使用聯合體;
當多種型別,多個物件,多個事物只取其一時(我們姑且通俗地稱其為“n 選1”),我們也可以使用聯合體來發揮其長處;可以把一個整型變數、一個字元型變數、一個實型變數放在同一個地址開始的記憶體單元中。即使幾個不同的變數共佔同一段記憶體空間。
所謂“共用體(union)”是指使幾個不同的變數共佔同一段記憶體的資料型別。

7、typedef是C語言的關鍵字,其作用是為一種資料型別定義一個新名字
格式:typedef 資料型別 自定義資料型別
typedef unsigned long uint32;
在嵌入式的開發中,由於涉及到移植問題,typedef的功能就更引人注目了

8、define
定義常量與命令(避免幻數)
#define MAX 100
#define SIZE 1024
#define LOGIN_SUCCESS 1
#define LOGIN_FAIL 0
注意:在巨集定義的命名時,儘量能夠清晰的表明其用途;

八、位運算及其運算子
1.按位與──&
(1)格式:x&y
(2)規則:對應位均為1時才為1,否則為0 :3&9=1
(3)主要用途:取(或保留)1個數的某(些)位,其餘各位置0。
2.按位或──|
(1)格式:x|y
(2)規則:對應位均為0時才為0,否則為1:3|9=11
(3)主要用途:將1個數的某(些)位置1,其餘各位不變。
3.按位異或──^
(1)格式:x^y
(2)規則:對應位相同時為0,不同時為1:3^9=10
(3)主要用途:使1個數的某(些)位翻轉(即原來為1的位變為0,為0的變為1),其餘各位不變。
4.按位取反──~
(1)格式:~x
(2)規則:各位翻轉,即原來為1的位變成0,原來為0的位變成1:在IBM-PC機中,0=0xffff,9=0xfff6。
(3)主要用途:間接地構造一個數,以增強程式的可移植性。
5.按位左移──<<
(1)格式:x<< 位數
(2)規則:使運算元的各位左移,低位補0,高位溢位:5<<2=20。
(3)實現&、|、^運算主要用途的方法
1)構造1個整數:該數在要取(或保留)的位、或要置1的位、或要翻轉的位上為1,其餘均為0。
2)進行按位與、或按位或、或按位異或操作。
(4)實現按位取反主要用途的方法
1)求~0,間接地構造一個全1的數;
2)按需要進行左移或右移操作,構造出所需要的數。
6.複合賦值運算子
除按位取反運算外,其餘5個位運算子均可與賦值運算子一起,構成複合賦值運算子: &=、|+、^=、<<=、>>=
7.不同長度資料間的位運算──低位元組對齊,短數的高位元組按最高位補位:
(1)對無符號數和有符號中的正數,補0;
(2)有符號數中的負數,補1。