Я знаю, что если arr
- это массив, то arr[i]=*(arr+i)
; и если это 2D-массив, то arr[i][j]=*(*(arr+i)+j)
; Поэтому у меня есть этот кодЗачем мне нужен дополнительный астерикс с использованием 2D-массива?
main(){
int arr[5][5];
int arr2[25]; // same as arr[5][5];
int i,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++){
arr[i][j]=i+j;
printf("arr[%d][%d] is at %p\n",i,j,&arr[i][j]);
}
printf("*(arr+i)=%d\n",*(arr+1)); // why this dont work
for(i=0;i<24;i++){
arr2[i]=i;
printf("arr2[%d] is at %p\n",i,(arr2+i));
}
printf("*(arr+i)=%d\n",*(arr2+1)); // prints 1 as expected
}
Я знаю, что в C нет такого понятия, как 2D массив, его в основном линейного ряд крупного смежного сгусток памяти. Поэтому мне интересно, почему я не могу напечатать значение 2D arr, используя * (arr + 1), что означает добавление 1*5*4
байт к базе arr и разыменование значения по этому адресу. Я знаю, что работает **(arr+1)
, но я не знаю, зачем мне эта дополнительная астерикс? Кроме того, если я делаю это printf("*(arr+i)=%p\n",*(arr+1));
так же, как я хотел бы использовать (arr+i)
интерпретировать как адрес
Что происходит с более волшебным зельем? – Quentin
Есть ли у каждого с Обеликс? – Klors
Какая черная магия? – BsD