如果你想把你的二維數組轉換成一個指向字符指針指針的數組,你要麼必須在本地範圍內的棧上爲你的char**
分配空間,要麼動態地分配空間。如果你去的地方範圍的做法,那麼你就需要簡單地創建的char*
一個數組,然後讓你的陣列點的每個成員每個字符串,像這樣:
char a[][20]={"Hi","Hello","Bye","Good Morning", "" };
int total_strings = 0;
int index = 0;
while(strlen(a[index++])) total_strings++;
char* ptrs[total_strings];
for (int i = 0; i < total_strings; i++)
{
ptrs[i] = a[i];
}
現在你可以使用數組指針如ptr[i][j]
(其中j
小於索引i
處字符串的長度),並且如果您需要通過引用將它傳遞給函數或將其分配給另一個變量,則ptrs
數組將衰減爲指針,因此您可以將ptrs
作爲char**
傳遞給函數,或傳遞給另一個char**
變量。
下一個辦法是指針數組的動態分配...這看起來像下面這樣:
char a[][20]={"Hi","Hello","Bye","Good Morning", "" };
int total_strings = 0;
int index = 0;
while(strlen(a[index++])) total_strings++;
//dynamic allocation of string pointer array
char** ptrs = calloc(total_strings, sizeof(char*));
for (int i = 0; i < total_strings; i++)
{
ptrs[i] = a[i];
}
//...more code
free(ptrs);
順便說一句,你不能這樣做的char** ptr = a
簡單的東西......那是因爲C預計內存的排列方式爲char**
。換句話說,char array[][]
實際上是一個內存中的線性數組,儘管它可以被索引爲一個二維數組。另一方面,char** ptr
是一個變量,它包含一個指向指針數組的內存地址。因此,ptr
必須包含指向適當指針數組的地址,並且每個指針ptr[i]
都需要包含指向數組char
的地址。做如char** ptr = a
那樣簡單的事情不會爲此發生適當的內存佈局。