C語言解惑要點

2021-05-10 03:37:16 字數 1772 閱讀 2886

1 運算子的優先順序

2 型別轉換

2.1 有符號與無符號數

結果輸出為

-2 -2

-1 2147483647

-1 2147483647

2.2 浮點數與整數

3 控制流

這一部分主要需要注意if else之間的巢狀時的配對情況,及迴圈語句的終止條件與狀態。

4 轉義字元

除了/n /t這一類的轉義字元,還有一類/ddd(三位八進位制數) /xhh(兩位二進位制數)的轉義字元,這些字元都代表單個char型別,而且其十進位制制數可以由相應的數制轉換過來。

5 變數的作用域與生命期

全域性變數:所有檔案都能看到,程式退出時生命期結束

區域性變數:只在定義的範圍內可見,離開定義的範圍後生命期結束

全域性靜態變數:只在所定義的檔案中可見,程式退出時生命期結束

區域性靜態變數:只在定義的範圍內可見,程式退出時生命期結束

6 指標與陣列

陣列名不是指標,因為我們取乙個陣列名的sizeof,結果為陣列長度×元素大小,而我們取指標取sizeof,總得到4。在一定程度上可以說陣列名是乙個常量標識。但陣列名在使用時經常表現的型別與指標。陣列名在作為實參傳遞時,將變為普通的指標。

一維陣列int a

陣列名a,指代了陣列的起始位址,我們有int* p=a=&a[0],二者的型別均為int*。而對於&a,它的值等於&a[0],但它的型別是(int (*))即指向一維陣列的指標。我們使用時a[i]被編譯器翻譯為*(a+i)。

如果我們使用指標int *p=a;則p在所有a出現的地方都可以替換之,即陣列名與乙個指向陣列首位址的整形指標的使用是神似的。

二維陣列int a[2][4]

陣列名a表示陣列的起始位址,有int *p=&a[0][0]=(int*)a,但此時a的型別不再是int*,而成為類似於指向一維陣列的指標即int(*)[4]。而對於&a,成為int (*)[2][4],即類似指向二維陣列的指標。此時a[i]=a+i=*(a+i)取得的各行的首位址,要得到行內的元素即a[i][j]應該使用*(*(a+i)+j)

7 字串常量

字串常量,分配在常量區,在編譯時就已經分配完成,在程式執行中可以取其值,但不可以修改其內容。程式設計師不需要擔心使用字串常量會洩露記憶體,因為它不並在堆上分配,而是由系統管理,使用過多常量的後果是程式所佔空間有所增大。對於許多函式而言,字串常量都可以作為乙個指標使用。

8 乘、除2與移位

在c中,乘2操作可以轉換為左移操作,不論有符號數還是無符號數,這一結論都是成立的。

除法操作遵照向0取整,如5/2=2,-5/2=-2。因此除2的近似操作與右移存在誤差。對於被除數為非負情況下,不存在誤差,而被除數為負時,存在誤差。x/2^k = (x+(2^k - 1))>>k; 

9 相異符號兩數模運算

結果與被除數保持相同

10 switch(i)

switch中的i只能是整數型別,或可以和整數型別直接等價表示的,如char型別。

11 陣列成員的位址與內容

對於陣列,注意取元素要用,或者等的對位址取*,對於陣列名加偏移,只是元素的位址而已。

C語言要點

一關鍵字 1.static 第乙個作用 修飾變數。變數又分為區域性和全域性變數,但它們都存在記憶體的靜態區。由於被static修飾的變數總是存在記憶體的靜態區,所以即使這個函式執行結束,這個靜態變數的值還是不會被銷毀,函式下次使用時仍然能用到這個值。static int j void fun1 vo...

C語言指標問題快速解惑

1 int a 3 int p a 把陣列名賦值給指標表示將陣列的首元素的位址賦予此指標。2 int a 3 int p a 0 a 0 是a陣列的首元素,而 則是取位址運算子,所以 a 0 取得的同樣是a陣列的首元素的位址,因此這段 的含義和 段是一致的。3 char c1 hello char ...

C語言解惑「定義」 與 「宣告」

所謂的定義就是 編譯器 建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或物件名。但注意,這個名字一旦和這塊記憶體匹配起來,它們就同生共死,終生不離不棄。並且這塊記憶體的位置也不能被改變。乙個變數或物件在一定的區域內 比如函式內,全域性等 只能被定義一次,如...