Введем очередной уровень. Переменная, которая хранит адрес другой переменной. Указатель всегда имеет тип хранимой переменной.
//сперва заведем переменную
int a = 45;
//сохранить адрес переменной в указатель
int * b= &a;
& это попытка взять адрес объекта.
//меняем значение по адресу.
//здесь a = 400, (*b) = 400 -- то есть меняется одна область памяти.
*b = 400;
Связь между одномерным массивом и указателем на int. Одномерный массив это ссылка на область памяти. Покажем, как сделать еще одну ссылку на тот же массив.
int a[]= {43,67,78};//создать массив из 3-х эл-тов
int * p = a;
for(int i = 0; i < 3; i++)
{
p++;//сдвинем по массиву на ячейку
*p = i*i;
}
Как это происходит с двумерным массивом.
int a[rows][cols];
for(i = 0; i < rows; i ++)
{
int ** p = a[i][0];
for(j = 0; j < cols; j ++)
{
p[ i][j] = i*rows + j;
p++;
}
}