二維陣列傳遞給二級指標

2021-05-13 01:04:12 字數 1874 閱讀 4929

二維字元陣列與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...