二維字元陣列與char** 關係 收藏
陣列和指標聯絡很緊密,陣列名的含義至少有兩種含義:
1. 對應資料中的第乙個元素的位址,
2. sizeof為陣列大小,而不是指標大小
注:《c專家程式設計》中有詳細介紹
程式設計中,需要向某個函式傳遞乙個字串陣列。測試**如下:
view plaincopy to clipboardprint?
·········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;
} #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**傳遞,那麼將字串定義為
view plaincopy to clipboardprint?
char* str_array[m];
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
二維陣列 二級指標 引數傳遞
指標陣列引數傳遞 二維陣列不能作為二級指標引數進行傳遞,無法強制轉換。即 void fun char p char str 2 6 fun str 這樣的呼叫會出錯。但是指標可以轉化為二級指標。如 void fun char p char str 6 fun str 這樣呼叫就ok。陣列指標引數傳遞...
二維陣列 指標陣列 陣列指標 二級指標
include 指標陣列 array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標 陣列指標 a pointer to an array,即指向陣列的指標 int a 4 指標陣列 表示 陣列a中的元素都為int型指標 優先順序高於 元素表示 a i int a 4 陣列指標...
二維陣列與二級指標
今日在論壇上看到有人問到指標 級指標和二維陣列 我們知道char array abcdef array是陣列的首位址,那麼在二維陣列中array當然也是陣列的首位址,看看這個定義char array 3 怎麼知道的呢?定義這樣乙個陣列,在vc除錯視窗中 我們看到 array 0x64324234 a...