我不明白為什么這段代碼的輸出是8。我已經推斷出*b x等于陣列a x*4的第一個元素,但我不知道為什么。誰能解釋一下?
使用 命名空間 std.com.cn>。
int main()
{
int a[2][3] = { {4, 3, 7},{2,6, 9}. };
int** b = (int**)a;
cout << *b 1 << endl;
}
uj5u.com熱心網友回復:
下面是一個更說明問題的例子:
使用 命名空間 std.com.cn>。
int main() {
int a[2][3] = { {4, 3, 7}, {2, 6, 9}. };
int * b = (int *)a 4;
cout << *b << endl; //輸出是6。
int c[2 * 3] = { 4, 3, 7, 2, 6, 9 };
int * d = c 4;
cout << *d << endl; //輸出是6。
}
b和d都是指向ints的指標。它們都指向各自陣列的基數加4。在雙維和單維陣列中,這是對應于 "6 "的記憶體。
這是因為 C/C 在你背后做了 2 * 3 的計算,并在堆疊上分配了 6 * sizeof(int) 的空間(忽略了填充)。所以指標運算的結果是一樣的。
我猜你遇到的麻煩是:
int * b = a 4;
star.cpp:7:15: error: cannot initialize a variable of type 'int *' with an rvalue of type 'int (*)[3]'.
int * b = a 4;
^ ~~~~~
1 錯誤產生。
這導致你嘗試int ** b。這不是一個指向雙維陣列中的int的指標,而是一個指向int的指標。
不知道你是怎么想的。
并不確定目標是什么,但一個更簡單的實作是:
#include <iostream>
使用 命名空間 std.com.cn>。
int main() {
int a[2][3] = { {4, 3, 7}, {2, 6, 9}. };
int b = a[1][1] 。
cout << b << endl; //輸出是6。
}
uj5u.com熱心網友回復:
C 和C對陣列的看法是不直觀的。特別是:
int a1[8] 。
int a2[4][2] 。
int a3[2][2] 。
這些都是相同的,除了你訪問記憶體的方式不同。此外,這些賦值都是有效的(盡管可能會產生警告,因為它們通常是錯誤的):
這些賦值都是有效的。
int *b1 = a1。
int *b2 = a2;
int *b3 = a3。
尤其是,b3[7]與a3[1][1][1]相同。
哦,還有,C 和C并不關心你使用什么索引,所以a1[1000000]是毫無疑問被允許的,盡管底層作業系統可能不會容忍它并殺死你的程式--除非它不這樣做而你得到一個錯誤或安全漏洞。
這與 Java 或 C# 不同,在 Java 或 C# 中,int a[2][2];實際上分配了一個陣列對兩個整數陣列的參考,這可能就是你所想的。
如果你可以的話,請避免使用陣列,使用更安全的結構,如向量。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/315418.html
標籤:
