字串的三種儲存方式

2022-01-29 18:11:42 字數 2489 閱讀 1918

目錄在資料結構中,字串要單獨用一種儲存結構來儲存,稱為串儲存結構。這裡的串指的就是字串。無論學習哪種程式語言,操作最多的總是字串。我們平常使用最多的儲存結構無疑是利用定長陣列儲存。但是這種儲存結構需要提前分配空間,當我們不知道字串長度的時候,過大的分配記憶體無疑是一種浪費。因此,合理的選擇字串的儲存方式顯得格外重要。下面將依次介紹三種儲存方式。

字串的定長順序儲存結構,可以理解為採用 "固定長度的順序儲存結構" 來儲存字串,因此限定了其底層實現只能使用靜態陣列。

使用定長順序儲存結構儲存字串時,需結合目標字串的長度,預先申請足夠大的記憶體空間。

例如,採用定長順序儲存結構儲存 "feizhufeifei",通過目測得知此字串長度為12(不包含結束符 '\0'),因此我們申請的陣列空間長度至少為 12,用 c 語言表示為:

char str[18] = "feizhufeifei";
下面是具體的c語言實現

#includeint main()

這種儲存方式基本是初學者都應該掌握的。下面介紹第二種儲存方式。

首先我們應該明確兩個概念:堆和棧。

堆是由我們程式設計師自己管理的,當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態分配到堆上,當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除。 

棧又稱堆疊,是使用者存放程式臨時建立的變數,也就是我們函式{}中定義的變數,但不包括static宣告的變數,static意味著在資料段中存放變數。除此之外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中,由於棧的先進後出特點,所以棧特別方便用來儲存、恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存,交換臨時資料的記憶體區。

當我們呼叫malloc時,就會在堆上劃分一塊空間給我們使用,具體**如下:

//建立了乙個動態陣列str,通過使用 malloc 申請了 10個 char 型別大小的堆儲存空間。

char * str = (char*)malloc(10*sizeof(char));

動態陣列的優勢是長度可變,根據需要動態進行分配。當我不想申請新的變數,但是又想要擴大str的空間怎麼辦呢?這個時候realloc函式就起作用了。

//通過使用這行**,之前具有10 個 char 型儲存空間的動態陣列,其容量擴大為可儲存 20 個 char 型資料。

str = (char*)realloc(str, 20*sizeof(char));

下面通過乙個合併兩個字串的例子來更好地理解下動態分配過程。

/*

* @description: 字串的堆動態堆分配記憶體

* @version: v1.0

* @autor: carlos

* @date: 2020-05-25

* @lasteditors: carlos

* @lastedittime: 2020-05-25

*/ #include #include #include //列印測試語句

#define debug 0

#if debug

#define dbg_printf(fmt, args...) \

do\while(0)

# else

# define dbg_printf(fmt, args...)

#endif

int main()

link;

/** * @description: 遍歷鍊錶,列印

* @param: link * head 結構體頭結點指標

* @return: 無

* @author: carlos

*/void printlink(link * head)

p = p->next;

}}/**

* @description: 初始化鍊錶

* @param: link * head 結構體頭結點指標。char * str 要操作的字串

* @return: link *結構體指標

* @author: carlos

*/link * initlink(link * head, char * str)

//使用#填充未滿的節點陣列空間

else

}//鏈結新舊兩個節點

if (i*linknum + j < length)

}return head;

}int main()

關於鍊錶不明白的可以參考這篇部落格史上最全單鏈表的增刪改查反轉等操作彙總以及5種排序演算法(c語言)

文中**均已測試,有任何意見或者建議均可聯絡我。歡迎學習交流!

如果覺得寫的不錯,請點個贊再走,謝謝!

有任何問題,均可通過公告中的***聯絡我

c 遍歷字串的三種方式

就以 把字串 1234 轉換為整形1234,為例來說明遍歷字串的三種方式 常規方式 下標 operator include include include include using namespace std int strtoint1 string str return value int ma...

Go語言字串拼接的三種方式

通過建立乙個緩衝byte型別的緩衝器str1,然後通過writestring方法將傳入的字串放入緩衝器的尾部,已達到拼接的作用,然後呼叫緩衝器str1的string 方法,可以返回放入緩衝器中的內容 實際返回的是緩衝器中未讀的部分 返回型別為string。var str1 bytes.buffer ...

PHP中 字串定義的三種方式

字串是一串字元的集合,是php中最常用的資料型別之一,字串的定義主要有三種方式,單引號 雙引號 heredoc和nowdoc。123456 abcdefg 是大叔 不解析變數,所見即所得,效率高,不能出現單引號 需轉義 可轉義字元 寫法輸出 描述 兩個反斜線 反斜線 backslash 反斜線 單引...