C語言中關於字元陣列和指標陣列

2021-07-23 22:08:43 字數 1479 閱讀 6487

做筆試題目的時候,碰到字元陣列初始化的問題,居然一下子懵了。

在c語言中儲存字串有兩種方法:字元陣列和字串指標

這兩者的儲存位置不同,首先字元陣列(區域性變數)是儲存在棧中的;指標指向字串時,則包括了兩部分,指標本身,儲存在棧中(區域性指標變數),字串本身儲存在**段(gcc中是這樣)。

基於上面一點就會產生很多不同,比如後者存在**段是肯定不能被修改的,當然也不能作為strcpy等函式的第乙個引數。

對於字串指標的使用比較簡單:

char *p = "frank";

char *p; p = "frank";

這兩種情況都是可以的,定義並初始化或是定義後再初始化。此時,一共占用了10b的空間(6b儲存字串,4b儲存指標)。

關於字元陣列就複雜一點:

char a[10];

怎麼給這個陣列賦值呢?

1、定義的時候直接用字串賦值

char a[10]="hello";

注意:不能先定義再給它賦值,如char a[10]; a[10]="hello";這樣是錯誤的!

2、對陣列中字元逐個賦值

char a[10]=;

3、利用strcpy

char a[10]; strcpy(a, "hello");

總結:定義的時候直接初始化,否則就要借助strcpy函式。

易錯情況:

1、char a[10]; a[10]="hello";//a[10]只代表乙個陣列中的乙個字元,乙個字元怎麼能容納乙個字串?況且a[10]也是不存在的!gcc中可以執行,但結果是錯的。

2、char a[10]; a="hello";//這種情況容易出現,a雖然是指標,但是它已經指向在堆疊中分配的10個字元空間,現在這個情況a又指向資料區中的hello常量,這裡的指標a出現混亂,不允許!

c語言的運算子根本無法操作字串。在c語言中把字串當作陣列來處理,因此,對字串的限制方式和對陣列的一樣,特別是,它們都不能用c語言的運算子進行複製和比較操作。

直接嘗試對字串進行複製或比較操作會失敗。例如,假定str1和str2有如下宣告:

char str1[10], str2[10];

利用=運算子來把字串複製到字元陣列中是不可能的:

str1 = "abc";     /*** wrong ***/

str2 = str1;       /*** wrong ***/

c語言把這些語句解釋為乙個指標與另乙個指標之間的(非法的)賦值運算。但是,使用=初始化字元陣列是合法的:

char str1[10] = "abc";

這是因為在宣告中,=不是賦值運算子。

試圖使用關係運算子或判等運算子來比較字串是合法的,但不會產生預期的結果:

if (str1==str2) ...    /*** wrong ***/

這條語句把str1和str2作為指標來進行比較,而不是比較兩個陣列的內容。因為str1和str2有不同的位址,所以表示式str1 == str2的值一定為0。

C語言中陣列指標和指標陣列

如果看這兩個概念的英文翻譯可能會更容易理解 陣列指標 pointer to array 指標陣列 a array of pointer 顧名思義,陣列指標就是乙個指標變數,該變數指向乙個陣列。而指標陣列就是乙個陣列,這個陣列的元素都是指標,即每乙個元素都可以當成乙個指標變數使用。下面給出兩者的定義和...

C語言中的陣列 指標陣列 陣列指標

1 include 2 3 int main 4 執行結果 0xbfeefda9 0xbfeefdaa 0xbfeefdab12 70xbfeefda9 0xbfeefdaa 0xbfeefdab12 7以上執行結果可以得出如下結論 char str 3 1 str i strr i 2 str i...

C 語言中陣列指標和指標陣列徹底分析

基本知識 當然我們一切都是從最簡單的內建型別開始,最後我會做一些推廣。先看一下基本的形式,我們從這裡起步 指標 int a 10 int p a 指標的指標 int b 20 int p b int p2p p 簡單陣列 int c 10 整數陣列,含有10個整數元素 file 也就是說每乙個元素都...