二維字元陣列與char 關係

2021-06-05 20:36:16 字數 1763 閱讀 8732

陣列和指標聯絡很緊密,陣列名的含義至少有兩種含義:

1. 對應資料中的第乙個元素的位址,

2. sizeof為陣列大小,而不是指標大小

注:《c專家程式設計》中有詳細介紹

程式設計中,需要向某個函式傳遞乙個字串陣列。測試**如下:

[cpp:showcolumns]view plain

copy

print?

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

#include 

#define m 2

#define n 100

void test(const

char** pstr)  

return;  

}  int main()  

;  test((const

char**) char_array);  

return 0;  

}  

期望能輸出陣列中的兩個字串。

很不幸實際編譯執行時,出現段錯誤。:( 仔細檢視後,發現有如下幾個需要注意的問題:

1. 傳遞給test的緊緊是二維字元陣列的首位址

2. test 引數中pstr的型別是char**, *(pstr+i)的型別是 char*

3. char**的記憶體結構可以看成有多個連續的char*型別的元素構成,而二維字元陣列是由m*n個字元組成。

記憶體示意圖

可以發現,當用char**傳遞二維字串陣列的首位址時。相同的位址空間,但由於元素型別不一樣,取出的值也不一樣。

使用*pstr時,實際上取出的是前4個字元組成的int值,不是期望中的char_array[0]的起始位址。所以出現段錯誤也就很好理解了。

如果想通過char**傳遞,那麼將字串定義為

[cpp]view plain

copy

print?

char* str_array[m];  

str_array對應的就是乙個char*型別組成的陣列。這樣就不會有問題了。

檢視《c專家程式設計》,發現c語言的「多維陣列」,其實就是陣列的陣列,可以看成是一種向量(即某種物件的一維陣列,它的元素可以是另乙個陣列)。

c指標經驗總結中對陣列名問題有過一段總結:

宣告了乙個陣列 type array[n], 則陣列名稱array就有了兩重含義:

1. 它代表整個陣列,它的型別是type[n], 大小是 n*(sizeof(type));

2. 它是乙個常量指標,該指標的型別是type* ,該指標指向的型別是type,也就是陣列單元的型別,該指標指向的記憶體區就是陣列

第0號單元,該指標自己占有單獨的記憶體區,注意它和陣列第0號單元佔據的記憶體區是不同的,該指標的值是不能修改的,即類似

array++的表示式是錯誤的。

在不同的表示式中,陣列名array可以扮演不同的角色。

1. sizeof(array)     array代表陣列本身

2. sizeof(*array)   算出的陣列單元的大小

3. sizeof(array+n) 算出的是指標型別的大小,32位機器中為4

二維字元陣列與char 關係

陣列和指標聯絡很緊密,陣列名的含義至少有兩種含義 1.對應資料中的第乙個元素的位址,2.sizeof為陣列大小,而不是指標大小 注 c專家程式設計 中有詳細介紹 程式設計中,需要向某個函式傳遞乙個字串陣列。測試 如下 期望能輸出陣列中的兩個字串。很不幸實際編譯執行時,出現段錯誤。仔細檢視後,發現有如...

二維字元陣列與char 關係

陣列和指標聯絡很緊密,陣列名的含義至少有兩種含義 1.對應資料中的第乙個元素的位址,2.sizeof為陣列大小,而不是指標大小 注 c專家程式設計 中有詳細介紹 程式設計中,需要向某個函式傳遞乙個字串陣列。測試 如下 include define m 2 define n 100 void test...

二維字元陣列

字元 串 指標 char p hello world 相當於 char p p hello world p是字串 hello world 的首位址。字串 hello world 存放在資料段。p 0 a 錯誤,不能修改。printf s p 列印出字串 printf c p 列印出字串的首個字元 p...