圖片可以提供幫助 - ASCII藝術很有趣(但很費力)。
char *stuff[] = {"hello","pie","deadbeef"};
+----------+ +---------+
| stuff[0] |--------->| hello\0 |
+----------+ +---------+ +-------+
| stuff[1] |-------------------------->| pie\0 |
+----------+ +------------+ +-------+
| stuff[2] |--------->| deadbeef\0 |
+----------+ +------------+
分配用於指針的1D陣列的存儲器是連續的,但不能保證在陣列指向的存儲器鄰接的部分保持的指針(這就是爲什麼指針線具有不同的長度)。
char stuff[3][9];
strcpy(stuff[0], "hello");
strcpy(stuff[1], "pie");
strcpy(stuff[2], "deadbeef");
+---+---+---+---+---+---+---+---+---+
| h | e | l | l | o | \0| x | x | x |
+---+---+---+---+---+---+---+---+---+
| p | i | e | \0| x | x | x | x | x |
+---+---+---+---+---+---+---+---+---+
| d | e | a | d | b | e | e | f | \0|
+---+---+---+---+---+---+---+---+---+
分配給二維數組的內存是連續的。 x表示未初始化的字節。請注意,stuff[0]
是指向'hello'的'h'的指針,stuff[1]
是指向'pie'的'p'的指針,並且stuff[2]
是指向'deadbeef'的第一個'd'的指針(並且stuff[3]
是'deadbeef'之後的空字節之外的字節的非可解引用指針)。
圖片相當不同。
注意,你可以寫以下任一:
char stuff[3][9] = { "hello", "pie", "deadbeef" };
char stuff[][9] = { "hello", "pie", "deadbeef" };
,你將有相同的內存佈局如圖2D陣列圖(所不同的是在x的將被清零)。
數組衰減指針 - 但它們不是同一件事! –