Разница между выражениями становится очень очевидной, если мы преобразуем их в нотацию массива, используя *(a + i) == a[i]
эквивалентность и ее следствие *a == a[0]
.
**(x + i)
равно x[i][0]
, тогда как *(*x + i)
is x[0][i]
.
В вашем коде мы хотим это:
#include <stdlib.h>
int **pointer_array = malloc(1*sizeof(int*));
^^
int *number_array = malloc(2*sizeof(int));
^
Тогда остальная часть кода означает это:
*(pointer_array)=number_array; // pointer_array[0] = number_array
Упс:Цикл присваивает указателям целые числа:
for(int i=0;i<2;i++) {
*(pointer_array+i)=i; // pointer_array[i] = i
}
Выше, вероятно, предполагается, что number_array[i] = i
.
for(int i=0;i<2;i++) {
printf("\n%d",*(*pointer_arr+i)); // printf ... pointer_arr[0][i]
}
Если мы исправим первый цикл для инициализации number_array
, то этот второйцикл должен получить эти значения.
В противном случае мы переходим к неинициализированным значениям.