c語言中指標是變數:
所以它有如下特點:
1.所佔記憶體大小(4個位元組 );
2.作用域
3.儲存區域
而指標又有步長,當指標進行表示式運算時。其步長跟所定義指標的型別相關
如:char *p 步長為1 int *p 步長為4;
所以在進行不同步長指標賦值時,會出現資料錯誤。
延伸出另外乙個知識點:大端位元組序與小端位元組序。
這是由不同cup決定的(inter大多數是小端位元組序)
如int num = ox12345678; 78是低位元組。
我們可以根據指標來判斷機器是位元組序:
int num = ox12345678
char *q = #
if(*q = ox78)
printf(「small」);
else
printf(「big」);
萬能指標void *p可以儲存任何型別的指標位址。對於void *型別的指標不可作取值運算,它所佔的步長為1;佔位位元組;其中malloc分配的位址返回值也為void *型別
野指標什麼是野指標??如何避免它?
未初始化的指標,它隨機指向一塊記憶體(linux下未初始化的變數,系統隨機分配),從而造成記憶體洩露,非法訪問一塊記憶體或者已經釋放的記憶體。
避免:首先要養成如下的編碼習慣:
1.當定義乙個指標時, 不確定它指向那,應該置為null;
2.往指標指向的空間進行賦值,要給指標分配空間(malloc函式);
3.判斷分配好的空間是否分配成功
4.初始化分配好的空間
5.使用分配好的空間時不要出現越界
6.使用完應該使用釋放函式釋放分配好的空間
7.釋放完再次置空指標。
其中free函式釋放空間不能超過分配的空間,否則出現堆溢位
3種記憶體分配函式的區別:
realloc函式 追加分配空間,會對分配的空間初始化
malloc函式分配一塊空間,但是不會對空間進行初始化
calloc函式不做初始化,分配幾塊連續的空間
陣列:理解一維陣列,二維陣列,三維陣列名的含義:
scanf("%d", a+i); 其中i是迴圈變數;
&a 表示陣列的首位址。其步長就為陣列的大小 +1 相當於加乙個陣列。
a +1 加乙個步長 4個位元組(int a);
int aa
對二維陣列取值等於二維陣列中首個一維陣列的位址(&aa) = aa;
再次取值 *aa = &a;
對於aa +i; 表示二維陣列的第i個一維陣列的位址
&aa + 1 表示加乙個二維陣列的步長
*aa + 1 表示加到下乙個元素
所以二維陣列賦值還可以
scanf("%d", *(*aa +i) +j)); i,j都是迴圈變數
int aaa[3][3][3]
對於三維陣列取值等於三維陣列中首個二維陣列的位址 *(&aaa) = aaa;
再次取值 *aaa 表示三維陣列中首個二維陣列的首個一維陣列的位址
再次取值表示 **aaa = &aaa;
對於aaa + i 表示三維陣列的第i個二維陣列的位址
&aaa + 1 表示加該三維陣列的步長
*aaa + 1 表示加到三維陣列中下乙個二維陣列
**aaa + 1 表示加到下乙個元素
陣列的位址上述提到陣列的位址
所以我們需要陣列指標來儲存陣列的位址
int (*pa)[3] ;
其用法在於使用二維陣列多維陣列作為函式引數傳遞時:如我想傳乙個二維陣列作為乙個函式中
void func(int *(par)[3]) 相當於將int a[3][3]陣列傳入
指標陣列:int *(pa[3]); 作用:
1.實現不規則多維陣列
2.節省空間(傳遞多行資料時候,不需要拷貝大量資料,只需用指標,節省空間)
當我們需要傳遞乙個指標陣列作為函式形參時候,需要定義乙個二維指標去接它
func(int ** s)
func(pa)
C 的一些知識點
include using namespace std 內聯函式,交換兩個數的值 建議直接定義,不用先在開頭宣告再在後面定義 inline void swap int a,int b int main int p newint 分配1個int型的記憶體空間 delete p 釋放記憶體 int p ...
C語言記憶體相關的一些知識點
整理了一些離散的概念點 1.棧和 段 資料段不一樣,棧是越靠近棧頂,其記憶體位址越小,而 段和資料段則是,越往後,其記憶體位址越大 資料段放啥呢 全域性變數,常量,函式裡的靜態變數。記憶體的規劃,從高位址到低位址是 棧段,自由段,堆段,資料段,段。棧自堆數代 棧的特點 先進後出,記憶體位址由大到小。...
c 一些比較細節的知識點 函式指標
因為unity3d專案需要,所以,需要用到dll來封裝一些功能。常年使用unity3d,c 基本忘記的差不多了。現在又要開始第n輪的複習。還有乙個原因就是,貌似unity3d,又走向il2cpp的趨勢。所以,還是趕緊抓回c 吧。多餘的介紹 完成 標頭檔案 classtest.h typedef in...