為什么這樣做:
char *name = "steven"。
但這不是:
char **names = {"steven", "randi", "ben"};
或者,為什么這樣做:
char *names[] = {"Steven", "Randy", "Ben"};
但是,同樣,這并不是:
char **names = {"steven", "randy", "ben"};
uj5u.com熱心網友回復:
一個char **p不是一個二維陣列,它是一個指向一個字符的指標。然而,你可以有更多的指標和更多的字符跟隨,類似于一種字符的二維結構模型。
C編譯器將{ "steven" }解釋為一維字符陣列,因為大括號是可選的(標準章節6.7.9第14段)。
正如你所嘗試的,你可以通過char *p[]宣告一個指向字符的陣列。
但是如果你想擁有那個指標(指向字符的指標),你需要告訴你的編譯器。一個陣列的地址可以被分配給指標。
char **p = (char *[]){ "steven", "Randy", "Ben", };
補充說明:由于字串字面是不可變的,你最好為這些字符添加一個const。而且由于這些未命名的字串字面的地址也是恒定的,你可以提供另一個。
const char * const *p = (const char * const []){ "steven", "Randy", "Ben", };
uj5u.com熱心網友回復:
我也在想,如果我可以用最簡單的方式回答你呢?
你為什么會感到困惑?
一個簡單的整數指標,例如分配給8個單元格的指標,其作用與一個陣列有8個單元格的尺寸相同。
唯一的區別是,你看不到的,一個分配了8個單元的指標是在被稱為HEAP的記憶體部分,而一個int tab[8]型別的變數是在STACK分配的。
事實上,由于單元格在記憶體中被鏈接,我們很容易想象一個指標和一個陣列,其第一個單元格地址被發送,是同一件事。
為什么在其他情況下不起作用呢 然而,當這個想法涉及到關聯(**和[][])的時候
讓我們以int **; 和一個 你有一個問題。
想象一下,一個雙陣列型別在記憶體中跟隨自己,因為這正是陣列的原則。
雖然一個雙指標首先分配了4個int *型別的單元(在記憶體中互相跟隨),然后這4個單元的每個指標,都指向一個3個ints的記憶體區域,它們互相跟隨。
一種你可能感興趣的方法 你可以做的一件事是創建一個 uj5u.com熱心網友回復: 標量物件的初始化器不可以包含一個以上的專案。
標籤: 上一篇:C:用指標靜態初始化復合結構
下一篇:在C語言中回傳2D陣列
int **tab;
tab = malloc(sizeof(int *) * 4) 。
//secure malloc不要忘記。
for (int i = 0; i < 4; i )
{
tab[i] = malloc(sizeof(int) * 3) 。
//secure malloc do not forget。
}
int[4][3];int ptr(*)[3];來代替。
它可以指向一個大小為3的陣列的第一個元素,例如,一個陣列的地址[4][3]。
6.7.9 初始化
C 2011在線草案
...
限制條件
11 標量的初始化器應該是一個單一的運算式,可以選擇用大括號括起來。物件的初始值是
物件的初始值是運算式的初始值(經過轉換);與簡單賦值相同的型別約束和轉換。
型別限制和轉換適用于簡單賦值,將標量的型別視為
的型別是其宣告型別的非限定版本。
char **names宣告了一個單一的標量物件,而不是一個陣列,所以它的任何初始化器必須只包含一個專案。 這個初始化器可以是一個單一的字串("steven"),可以選擇用大括號括起來({ "steven" })。 然而,它不可能是一個初始化器的串列。


