2017-06-28 160 views
2

我試圖通過指向指向實際上是字符串的另一個指針的指針來提高我對指針的瞭解。2d指針的大小

現在,我想誰大小通常我可以從sizeof(foo[0])/sizeof(foo[0][0])

指針形式得到

char** foo; 
+1

什麼長度?尺寸? 'sizeof(char *)'或'sizeof * test'就是爲此。 –

+2

C和C++不是相同的語言。選一個。 – tambre

+1

指針指針不是二維數組。 – Lundin

回答

1

sizeof(test)/sizeof(*test)並不表示元素的數量聲明,因爲編譯器不知道指向的是什麼指針,因爲sizeof()是編譯時操作,因此不是動態的。 要找到沒有元素,可以添加一個標記值:

char **test = {"New York", "Paris", "Cairo", NULL}; 
int testLen = -1; 
while(test[++testLen] != NULL){ 
//DO NOTHING 
} 
+0

謝謝大家,你的回答很好,對未來有用,我非常抱歉,因爲我無法選擇你,但這正是我所期待的。 –

2

你將永遠不會得到一個內存塊的大小,其中一個指針指向......因爲可以有任何東西。

測試僅指向在存儲器中的地方,一些其他的指針被存儲(到第一個)。每個指針將再次導致內存中存儲一​​些字符值的另一個地方。因此,您的測試變量包含一個簡單的數字(內存中某個位置的索引),並取決於您的操作系統sizeof(test)可能會有4個字節或8個字節作爲結果,而與分配的內存大小無關。

sizeof()會像使用堆棧數組時那樣工作。如果測試被聲明爲

char test[10][20]; 

隨後的sizeof(測試)實際上將返回200

+0

10 * 20 * 1 = 200行col col https://en.wikipedia.org/wiki/Row-_and_column-major_order – EsmaeelE

1

如果您正在分配大量的東西你用malloc()malloc接收一個參數 - 以字節爲單位的大小(例如malloc(sizeof(int)*20)malloc也返回void指向分配的內存。您通常這個指針,以適應你的類型。 換句話說,你不能真正得到大小。你必須在一些地方保存它,並把它傳遞給其他的功能它需要的時候。

指向指針(**)的指針就像添加一個額外的維度。

[]這些都是比較語法糖指針運算的。 a[i]將與*(a+i)相同。

這可能會在系統上有所不同,但sizof()會給你這些類型的這些值。

int a;  //4 
int b[5]; //20 
int* c;  //8 
int d[5][5];//100 
int** e; //8 
+0

謝謝你回答,似乎幫助完整,但它可能會我的英文不好?或者它很難,但我從來沒有能夠做到malloc和它的作用是什麼。「字節大小」確定,但是這些是什麼? 「還會返回一個指向分配內存的空指針」,好吧,我知道了,它會返回一個類似於新內存的指針......但我仍然感到困惑。你能否在這裏給我更多的例子? –

+0

順便說一句,我很抱歉未完成的回覆,我按了輸入mystake –

+0

'malloc'用於動態內存分配。要理解它,你必須首先知道程序如何使用內存。有一個'stack'和一個'heap' int [5] a;'將被放置在堆棧上。如果你使用'int * a =(int *)malloc(sizeof(int)* 5)',這將被分配在堆上。 在C++中,你使用'new'來分配這個內存。 這兩個數組現在可以像'a [0]'一樣從0迭代到4,但第一個在棧上,第二個在堆上。還有一件事是,只有在編譯時知道大小時才能創建堆棧數組,例如使用常量來創建它。 –