建立乙個struct,來管理乙個動態增長的陣列

2021-10-05 23:39:39 字數 1510 閱讀 3191

c++程式設計思想,在介紹資料封裝給了乙個cstash的例子,大概的思想是,建立乙個struct,來管理乙個動態增長的陣列。這個陣列可以接受任何型別的基本資料型別。包括示例中的int和char,乙個能儲存多種資料型別的底層資料型別,當然是最小的型別也就是sizeof運算子返回為1的資料型別,綜合考慮,原書中給出的unsigned char作為最基本的資料型別。實際上對應於標準的位元組陣列。對於這個轉化過程,我寫了一些**驗證了一些問題。順便複習一下,計算機體系結構中的位元組序的問題。

以下是我的cstash實現**:

#include

#include

using namespace std;

const int increment = 100;

struct cstash

int count()

void flate(int incre)

{int newquantity = quantity + incre;//新增長後元素數量

int newsize = newquantity * size;//新容器整個位元組數

int oldsize = quantity * size;//舊容器中位元組數

unsigned char *tmp = new unsigned char[newsize];//重新分配記憶體

//複製舊元素

for(int i=0;i現在分析上面**值得學習的地方,首先為什麼是無符號的字元陣列,因為有符號的位元組陣列,因為符號的原因,會產生非預期的效果。其次新增元素和查詢元素引數都是指標,指標變化的只是指標能訪問資料型別的限制,而不是資料本身,所以這種轉換並沒有破壞資料本身。而且void * 使得程式能處理更通用的資料型別。還有這個動態增長的思想,其實標準庫中有很多地方都有這種思想存在,這裡的**給人更直觀的學習機會!

為了驗證乙個int(我的機器上32位環境下4位元組)轉換為unsigned char過程中發生了什麼,這就涉及到了一點計算機體系結構的知識,也就是位元組序的問題了。

驗證程式如下:

#include

#include

#include

using namespace std;

void convert(void *element,int size)

{//轉換為位元組陣列指標

unsigned char *tmp = (unsigned char *)element;

for(int i=0;i上面的程式將int * 轉化為 unsigned char *之後檢視四個位元組的內容,得到了非常有意思的結果

10-----10 0 0 0

1024--0 4 0 0

看到沒,0 4 0 0和10 0 0 0都說明是從低位開始放置資料的,低位資料是放在小位址上面的。按照維基百科(關鍵字:位元組序)的說法,x86體系的計算機是小端序的,也就是從低位元組開始增長。 為什麼是0 4 0 0應為 2^10 = 1024 (二進位制100 0000 0000) 十進位制為0 0 4 0 反過來就是 0 4 0 0。小端序就是說位址是從低位開始增長,而且資料的低位放在低位址,高位放在高位址。

jquery 學習,乙個乙個來

1.document ready function 與window.nl ad function 的區別 前者為建立完畢dom就執行,可以新增多次.可以用 window load 來實現後者.也可以這樣jquery function 後者為建立完畢並載入完畢才執行,寫多個時後寫的會沖掉先寫的,只能執...

用命令來建立乙個tag

博主在做作業時,看到需要弄個tag,之前都沒有弄過,就自己琢磨一下,最後還是琢磨出來了,現在就分享出來。如果有什麼不對的地方,就請指出來吧!在本地建立乙個tag,命令如下 git tag a v1.0 m 第乙個版本 上面的命令中的 v1.0 是可以修改的,就是乙個名字。後面的單引號裡的內容是注釋用...

乙個關於struct的問題

include include include struct stu stx int main 需要注意的幾點 1.上面的struct在定義結束前有 stx 他的意思也就是相當於宣告了 stx是乙個指向名為stu的結構體指標,但是並沒有為它申請記憶體空間。2.如果沒有標號為1的這一行的話,上面的程式...