C 指標知識記錄

2021-08-20 09:20:34 字數 1565 閱讀 6828

c/c++中指標的運用十分頻繁,且極其容易出錯,一旦出現引用空指標或指標未釋放都可能引起程式的bug。其中,指標的指標這一概念更是不好理解,在這裡記錄一下指標一些問題的測試,便於將來查閱。

測試1測試2

首先定義乙個void型指標p,將指標指向null:

void *p = null;
接著定義乙個指標的指標pp,指向指標p:

void *pp = &p;
於是,這裡可以看出指標p的值應該為其指向的變數null的位址,由於此時p為空指標,因此若使用*p這會導致編譯報錯,因為使用了空指標;同理,此時指標pp的值為變數p的位址,而 *pp為變數p的值,應該為null,如下語句測試:

cout << "p " << p << "    " << "pp " << pp << endl;

cout << "*pp " << *pp << endl;

結果如下:

p 00000000 pp 00f7fc1c

pp 00000000

可以看出,雖然p變數指向null,但是p的位址值是實際存在的。

定義乙個結構體:

typedef struct _test_y_test, *ptest;
然後,定義乙個指標phandle:

void *phandle = null;
接著為該指標分配記憶體:

phandle = (void*)malloc(sizeof(test));

ptest ptest = (ptest)phandle;

這裡,為指標phandle分配記憶體是必須的,如果沒有為phandle分配記憶體,直接將ptest指向phandle指向的位置,那麼ptest也是null,這時對ptest作如下操作就會出現異常:

ptest->a = 10;

ptest->c = 100;

在對phandle指標分配記憶體之後上面兩行**已經沒有問題了,但是對變數b的賦值依然存在問題:

ptest->b = "ssss";
上面的**會出現異常;

如果,修改test結構體的定義,把成員變數b改為乙個陣列變數,如下:

#define max 10

typedef struct _test_y_test, *ptest;

然後,對b的賦值修改為:

ptest->b[5] = 1;
這樣就不會報錯,這是什麼原因呢?

其實,是因為當結構體變數中成員量b為string型別時,由於string是乙個類,而在對類的變數賦值時應該呼叫類的建構函式,而直接將"ssss"賦值給b沒有呼叫這個過程,因此就會報錯;那麼這個問題該如何解決:

採用new的方法新建test變數;

使用 placement new 操作符,貌似比較複雜,不介紹…(因為我也沒細看-_-||)

C 知識記錄1

3.malloc和new 1.malloc與free是c c語言的標準庫函式,new delete是c 的運算子。但它們都可用於申請動態記憶體和釋放記憶體。2.對於非內部資料型別的物件而言,用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構...

雜碎知識記錄

清除客戶端快取 response.cache.setcacheability httpcacheability.nocache 絕對過期快取 向 cache 中插入具有依賴項和過期策略的物件。引數key用於引用該物件的快取鍵。value 要插入快取中的物件。dependencies 所插入物件的檔案...

小知識記錄

清除浮動 新增子元素,左右都不允許出現浮動元素。清除a的下劃線 text decoration none 清除li前的小圓點 li 聖杯布局 negative margin 關於文件流,浮動流和position input標籤的型別 color,date,email 可使用偽類 或 元素。style...