陣列和指標聯絡很緊密,陣列名的含義至少有兩種含義:
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...