程式設計師筆試(1) 陣列和字串

2021-07-22 10:15:39 字數 1745 閱讀 4856

陣列和字串是最簡單的資料結構,它們在一塊連續的記憶體空間中分別儲存數字和字元,因此將這兩種簡單的資料結構總結一下。

陣列必須在建立時指定大小,根據指定大小預先分配記憶體。所以陣列的缺點就是大小固定不夠靈活,而且空間利用率不高,就算你只需要儲存乙個數字,也需要為所有資料預先分配記憶體。

為了彌補這一缺點,c++ stl 提供了動態陣列vector容器,vector可以根據儲存的元素數量動態調整陣列大小。例如:當vector容器內元素數量等於容器的容量(capacity),我們需要再向其中新增元素時,系統會為vector分配一片新的連續記憶體,來保證容器有記憶體空間儲存新的元素。開闢新的記憶體空間的時間複雜度是o(n),為了避免每次新增乙個元素都要開闢新的記憶體空間,我們可以每次分配新的記憶體大小為原陣列大小的兩倍,根據聚合分析可知,n個陣列操作的期望時間複雜度為o(1)。

陣列的優點則在於隨機訪問時間複雜度為o(1),由於陣列儲存在一片連續的記憶體當中,所以可以通過首個元素的記憶體位址+k倍的每個元素所佔的記憶體來獲得第k + 1 個元素的記憶體位址。根據這一特性,可以構造直接定址的雜湊表高效的解決一些問題。

陣列和指標有非常密切的聯絡,當我們宣告乙個陣列時,該陣列名則是陣列首個元素的位址。一般情況下我們都可以將陣列名和指標當作一回事。但是在使用sizeof和decltype運算子時,陣列和指標有很大的區別。可以看下面的**(出自《劍指offer》2.3.1)。

int getsize(int data)

int _tmain(int argc,_tchar* argv);

int size1 = sizeof(data1);

int*data2 = data1;

int size2 = sizeof(data2);

int size3 = getsize(data1);

printf(%d,%d,%d,size1,size2,size3);

}

**最後輸出是20,4,4。首先data1宣告為陣列,因此sizeof(data1)就是求陣列的大小,5個int型變數總共佔20位元組的記憶體。而data2申明為指標,儘管它指向data1的第乙個陣列,但是它本質上還是指標,對於32位系統來說,所有指標變數的記憶體大小都為4位元組(64位為8位元組)。而size3為4的原因是,陣列不能作為函式的引數,當傳遞陣列作為函式引數時,陣列會自動退化為指標。值得注意的是,由於陣列不儲存關於元素大小的資料,因此將陣列作為引數傳遞時,在函式內部不能得到陣列的大小,必須在函式外部顯示的利用sizeof(a)/sizeof(a[0])來獲取陣列大小,通過引數再傳遞給函式。

c++中的都以』\0』結尾,這樣能方便的找到字串的尾部。因此每個字串都會增加乙個字元的開銷,需要小心越界訪問。比如:

char

str[10];

strcpy (str,"0123456789");

由於我們宣告的字串只有10個位元組的空間,而」0123456789」實際上有11個字元(包括尾子符』\0』),因此賦值出錯,字串應至少 有11個位元組的記憶體空間。

為了節約記憶體,c++將常量字串放在乙個特定的記憶體空間(常量記憶體)中,當幾個字串指標都指向同乙個字串時,它們實際的指向位址是相同的。但是如果用常量字串初始化字串陣列的話,情況卻有所不同。因為初始化字串陣列時,字串陣列會重新開闢一片記憶體,然後將常量字串的值拷貝到新的位址當中。因此,初始化兩個不同的字串陣列時,即使陣列內儲存的字串是相同的,兩個字串陣列的記憶體位址也不同,因此陣列名指標指向的位址也不同。

黑馬程式設計師 字串指標與字串陣列

1 字串指標 定義 char 變數名 字串內容 字串內是常量 作用 用來儲存字串 在c語言中有兩種訪問字串的方式 1 用字串陣列 char string nbheimanb 注意 存放在棧區,可讀可寫。2 用字串指標 char 變數名 字串內容 字串內容是常量 char str nbheimanb ...

黑馬程式設計師 C語言 陣列 字串

asp.net android ios開發 net培訓 期待與您交流!陣列 陣列用來存放一組型別相同的資料 定義陣列 int num 10 int是陣列內元素的型別 num是陣列名 10是陣列內元素的個數 初始化陣列 int a 3 int a 3 int a int a 3 如果定義陣列的同時進行...

黑馬程式設計師 指標與陣列字串

指標和陣列 int ages 5 陣列元素的訪問方式 int ages 5 int p p ages 1.陣列名 下標 ages i 2.指標變數名 p i 3.p i 指標變數的 1究竟加多少,取決於指標的型別 利用乙個指標來接收乙個陣列,指標變數array指向了陣列的首元素 void chang...