register—必須是乙個單一的值,並且長度應小於等於整型的長度。並且rigister變可能不存放在記憶體中,所以不能用取位址運算子「&」來獲取其位址。
static—被static修飾的變數總是存在記憶體的靜態區,所以即便函式結束,這個靜態變數的值依然存在,下次仍然可以使用。
在修飾全域性變數時,作用域僅限於變數被定義的檔案中,其他檔案即使用extern宣告也無法使用它。(除非在前面加extern*)**
sizeof—在計算變數所佔的空間大小時,括號可以省略;在計算型別的大小時,括號不可省略。
例:sizeof i;(正確) sizeof int;(錯誤)
sizeof (i);(正確) sizeof (int);(正確)
case—case後面只能是整型或字元型的常量或常量表示式。
(switch—case語句不是匹配度高的優先匹配,而是就近匹配。)
(空型別):注釋/限制程式
(真正發揮的作用在於:1對函式返回的限定 2對函式引數的限定)
void*—(空指標):可以指向任何型別的資料
空指標可以包容任何型別,但是有型別不能包容空指標
例:
void*p1;
int*p2;
p1=p2;(√ 空指標可以包容有型別)
int*p1;
void*p2;
p1=p2;(×有型別不能包容空指標)
注1:無論在c/c++中,若函式不接受任何引數,一定指明引數為void
2:void不能代表乙個真實變數(系統定義void變數,不知開闢多大的記憶體空間)
return—return語句不可返回指向棧記憶體的指標,因為該內存在結束時會被自動銷毀。
(唯讀變數)—修飾常量
全域性的唯讀變數,存放在靜態區
注1:const唯讀變數,具有不可變性——不能用來定義陣列的維數,也不能放在case之後。
2:const修飾的唯讀變數必須在定義的同時初始化。
3:編譯器通常不為普通const唯讀變數分配儲存空間,而是將他們保留在符號表中,使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作。——節省空間,避免不必要的記憶體分配,提高效率。
4:修飾指標時,就近原則,——離誰近就修飾誰。
5:const可修飾函式的引數(防止引數值被函式體的意外改變)
(易變,不穩定)
當要求使用volatile宣告變數時,系統會重新對它所在的記憶體讀取資料。精確地說,當遇到此關鍵字宣告變數時,編譯器對訪問該變數的**不進行任何優化,
**從而 int *ip =…; //裝置位址
*ip = 2; //第二個指令
以上程式compiler可能做優化而成:
int *ip = …;
*ip = 2; 任何的優化,從而保證程式的原意:
volatile int *ip = …;
ip = 1;*
ip = 2;
volatile定義的變數會在程式外被改變,每次都必須從記憶體中讀取,而不能重複使用放在儲存器或暫存器中的備份。**
—主要用來壓縮空間—配置乙個足夠大的空間以容納最大長度的資料成員。
注:1所有的資料成員共用乙個空間
2同一時間,只能儲存乙個資料成員
3所有的資料成員具有相同的起始位址
因運算子導致表示式的優先順序問題——容易出錯的情況:
#define巨集定義表示式
注:巨集函式被呼叫時是以實參代換形參,而不是「值傳達」。
涉及到運算子優先順序的問題,不能忘了帶括號。。。。。
例1:#define sqr(x) x*x
若x=10+1,替換後sqr(x)為:10+1
*10+1=21(≠121)
——#define sqr(x) ( x)*(x)
例2:#define sqr(x) (x)+(x)
**為:sqr(x)*sqr(x)
若x=5
*3,替換後sqr(x)為:(5
*3)+(5
*3)*(
5*3)+(5
*3)=255(≠900)
——#define sqr(x) ((x)+(x))
——設定編輯器的狀態/指定編輯器完成一些特定的動作。
常用的:
eg1:#pragma message(訊息文字)
當編輯器遇到這條指令時就在編譯輸出視窗將訊息文字列印出來。
eg2:#pragma once
在標頭檔案最開始加入,以保證標頭檔案被編譯一次。
eg3:#pragma warning
# pragma warning(disable:4996 996):不顯示4996和996號警告訊息。
#pragma warning(once:4385):4385號警告訊息僅報告一次。
#pragma warning(error:4385):4385號警告訊息作為乙個錯誤。
#pragma warning(push):儲存所有資訊的現有的警告狀態。
#pragma warning(push,n):儲存所有資訊的現有的警告狀態,並且把全域性警告等級設定為n。
#pragma warning(pop):向棧中彈出最後乙個警告資訊,在入棧和出棧之間所作的一切改動取消。
#pragma comment——將乙個注釋記錄放入乙個物件檔案或可執行檔案中。
eg3: #pragma pack
#pragma pack(n):編譯器按n個位元組對齊。
#pragma pack():編譯器取消自定義位元組對齊方式。
#pragma pack(push):儲存當前對齊方式到packing stack
——等效於#pragma pack(push,n)
#pragma pack(pop):packing stack出棧,並將對齊方式設定為出棧的對齊方式。
#運算子
#define sqr(x)
printf("the square of x is %d\n",((x)*(x)) ;
sqr(8);
輸出:the square of x is 64 (此時,字元x被當做普通文字處理,而非可替換的語言符號。)
若改為:
#define sqr(x)
printf("the square of#x is %d\n",((x)*(x)) ;
sqr(8);
輸出:the square of x is 64 (此時,字元x被當做普通文字處理,而非可替換的語言符號。)
##運算子用於巨集函式的替換部分,把兩個語言符號組合成單個語言符號,
eg:#define xname(n) x##n
xmame(8)
則會被展開成:x8
(c語言基礎很差,請各位大佬不要見笑~~)
C語言基礎知識梳理
準備開乙個部落格專欄,關於cocos2d x遊戲開發的。因為cocos2d x是c 編寫的,所以也打算使用c 來講。1 基本型別 1.1 數值型別 a 整型 短整型short,整型int,長整型long b 浮點型 單精度float,雙精度double 1.2 字元型別char 2 構造型別 2.1...
C語言基礎知識梳理
資料型別 常量 常量包括字面常量 直接常量和符號常量 變數 c語言規定標誌符只能由字母 數字和下劃線三種字元組成,且第乙個字元必須是字母或者下劃線 必須壓迫先定義後使用 每乙個變數被定義以確定型別後,在編譯時就能為其分配相應的儲存單元 整數型別 整數常量有十進位制 八進位制和十六進製制 d 整形變數...
C語言知識點梳理 1
include int main 這是主函式。當程式執行時main函式是起始函式,程式的起點。int為函式的返回值型別,括號中的內容為函式的引數,這裡主函式沒有引數,所以括號中沒有內容,在自定義函式中如果需要引數則需要在括號中依次定義引數的型別和引數名 如 int pow int int a,int...