Я отвечал на этот вопрос question, но когда я протестировал следующий код , я смутился.Почему int ** ptr указывает на тот же адрес, что и int arr [3] [3] при доступе к ptr [i] [j]?
#include <iostream>
using namespace std;
int main()
{
int **ptr;
int arr[3][3];
ptr =(int **) arr;
for (int i=0;i<3;i++){
for (int j=0;j<3;j++){
cout << &arr[i][j] << " =? ";
cout << &(ptr[i][j]) << endl;
}
}
return 0;
}
Но я получаю этот поток вывода:
0x7fff5700279c =? 0
0x7fff570027a0 =? 0x4
0x7fff570027a4 =? 0x8
0x7fff570027a8 =? 0
0x7fff570027ac =? 0x4
0x7fff570027b0 =? 0x8
0x7fff570027b4 =? 0
0x7fff570027b8 =? 0x4
0x7fff570027bc =? 0x8
Почему они не то же самое?
Потому что вы использовали злую личность: 'ptr = (int **) arr;' 'ptr' должен быть объявлен' int (* ptr) [3]; '. –
См. Http://stackoverflow.com/questions/3515045 –
'int *' и 'int []' совместимы, но вы сделали общее, но неправильное обобщение, когда считали, что означает, что 'int **' совместим с ' ИНТ [] [] '. Вот почему вам пришлось добавить бросок, броски опасны, избегайте там, где это возможно. – john