2011-09-08 168 views
0

我有一個二維數組像這樣...指針二維數組

char a[][20]={"Hi","Hello","Bye","Good Morning"}; 

現在我需要一個字符指針指該陣列中,修改在陣列中的串的一個通過指針和打印這兩種改性陣列並通過指針數組...

的修改陣列:

strcpy(p+1,"Come");//copy string "Come" to array 

    a[1][1]='O';//copy char 'O' index [1][1] 

即..預期輸出:

陣:嗨,來了再見早安

指針:喜來再見早安

我在通過指針 分配指針數組和打印陣列的一個問題請幫助...

回答

0

如果你想把你的二維數組轉換成一個指向字符指針指針的數組,你要麼必須在本地範圍內的棧上爲你的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那樣簡單的事情不會爲此發生適當的內存佈局。