在 c 語言中,凡不加返回值型別限定的函式,就會被編譯器作為返回整型值處理。
在多重迴圈中,如果有可能,應當將最長的迴圈放在最內層,最短的迴圈放在最外層,以減少 cpu 跨切迴圈層的次數。
return 語句不可返回指向「棧記憶體」的「指標」,因為該內存在函式體結束時被自動銷毀。
大端模式(big_endian) :字資料的高位元組儲存在低位址中,而字資料的低位元組則存放在高位址中。
小端模式(little_endian) :字資料的高位元組儲存在高位址中,而字資料的低位元組則存放在低位址中。
null就是null,它被巨集定義為0,不是null或null,c語言對大小寫是敏感的。
定義和宣告之間的區別:定義分配的記憶體,而宣告沒有。定義只能出現一次,而宣告可以出現多次。
extern char *a;這裡extern告訴編譯器a這個名字已經在別的檔案中被定義了,下面的**使用的名字 a是別的檔案定義的。
int *p1[10]; 「」的優先順序比「*」要高。p1先與「」結合,構成乙個陣列的定義,陣列名為 p1,int *修飾的是陣列的內容,即陣列的每個元素。那現在我們清楚,這是乙個陣列,其包含 10個指向 int型別資料的指標,即指標陣列。
int (*p2)[10]; 「 () 」的優先順序比「」高, 「*」號和 p2構成乙個指標的定義,指標變數名為 p2,int修飾的是陣列的內容,即陣列的每個元素。陣列在這裡並沒有名字,是個匿名陣列。那現在我們清楚p2是乙個指標,它指向乙個包含 10個 int型別資料的陣列,即陣列指標。
在c語言裡,賦值符號「=」號兩邊的資料型別必須是相同的,如果不同需要顯示或隱式的型別轉換。
c語言規定只有靜態儲存陣列和外部儲存陣列才可作初始化賦值。
c語言允許用字串的方式對陣列作初始化賦值。例如:
static char c=; 可寫為:
static char c=; 或去掉{}寫為:
sratic char c="c program";
用字串方式賦值比用字元逐個賦值要多佔乙個位元組, 用於存放字串結束標誌'/0'。
測字串長度函式strlen 格式: strlen(字元陣列名) 功能:測字串的實際長度(不含字串結束標誌『/0』) 並作為函式返回值。
一般把儲存器中的乙個位元組稱為乙個記憶體單元。
指標運算子
(1)取位址運算子&
取位址運算子&是單目運算子,其結合性為自右至左,其功能是取變數的位址。在scanf函式及前面介紹指標變數賦值中,我們已經了解並使用了&運算子。
(2)取內容運算子*
取內容運算子*是單目運算子,其結合性為自右至左,用來表示指標變數所指的變數。在*運算子之後跟的變數必須是指標變數。需要注意的是指標運算子*和指標變數說明中的指標說明符* 不是一回事。在指標變數說明中,「*」是型別說明符,表示其後的變數是指標型別。而表示式中出現的「*」則是乙個運算子用以表示指標變數所指的變數。s
多維陣列
define pf "%d,%d,%d,%d,%d,/n"
main() ;
printf(pf,a,*a,a[0],&a[0],&a[0][0]);//元素a[0][0]的位址
printf(pf,a+1,*(a+1),a[1],&a[1],&a[1][0]);//元素a[1][0]的位址
printf(pf,a+2,*(a+2),a[2],&a[2],&a[2][0]);//元素a[2][0]的位址
printf("%d,%d/n",a[1]+1,*(a+1)+1);//元素a[1][1]的位址
printf("%d,%d/n",*(a[1]+1),*(*(a+1)+1));//元素a[1][1]的值
} 變數的儲存方式
在c語言中,對變數的儲存型別說明有以下四種:
auto 自動變數
register 暫存器變數
extern 外部變數
static 靜態變數
自動變數和暫存器變數屬於動態儲存方式, 外部變數和靜態變數屬於靜態儲存方式。
指標傳遞和引用傳遞
指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值。
引用傳遞過程中,被調函式的形式引數也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。
引用傳遞和指標傳遞是不同的,雖然它們都是在被調函式棧空間上的乙個區域性變數,但是任何對於引用引數的處理都會通過乙個間接定址的方式操作到主調函式中的相關變數。而對於指標傳遞的引數,如果改變被調函式中的指標位址,它將影響不到主調函式的相關變數。如果想通過指標引數傳遞來改變主調函式中的相關變數,那就得使用指向指標的指標,或者指標引用。
不要用陣列名做++,因為陣列名是乙個常量,下面的做法是錯誤的。
void main()
;for (;a < a+5;a++)
system("pause");
}
c 學習摘要
1.析構函式為什麼多為虛函式 基類的成員函式如果為虛函式,那麼其子類可以重新實現該函式,如果基類成員函式不為虛函式,那麼子類如果想擁有該方法需要過載。析構函式在物件銷毀時呼叫,用以銷毀物件內那些未被銷毀的變數。這就要求子類可以有自己的析構函式,來銷毀自己的需要銷毀的變數。2.什麼是純虛函式 基類本身...
C 學習摘要
q 動態載入dll後,延遲解除安裝 記錄每次踩過的坑方便查詢.場景說明 專案中有兩個標頭檔案 define.h和clientudp.h clientudp類中需要用到define.h中的型別定義.define.h中定義函式指標型別時需要用到clientudp.h中的類定義 這就導致兩個標頭檔案迴圈包...
C 學習摘要5
include using namespace std class point point int main include include using namespace std class document void getname class book public document void...