C語言的一些知識點,主要是指標的一些知識

2021-09-22 10:26:37 字數 2029 閱讀 6751

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...