Указатель на двухмерный массив - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем привет, вот случайно наткнулся на тему указателей и возникла проблема с пониманием. Объясню: допустим имеем массив и указатель на него
int i[90], *ptr;
Известно что i == &i[0] и можно бегать по его значениям через адрес:
ptr = i;
*(ptr+N)
Но тогда возникает вопрос: Допустим имеем двухмерный массив
int t[10][10];
Также нам известно, что t == &t[0][0](так в книге написано у Герберта шилдта), но тогда почему правила "бегания" по двухмерному массиву немного отличаются от обычного массива? Да и просто указателю p нельзя приравнять t.
int t[10][10], *p;
p = (int *)t;
 
*((int *)p+N) // Вот такая так сказать формула
Но я не понимаю, зачем тут (int *), если вроде двухмерный массив также последовательно размещается в памяти, то адрес t это его начальный байт, то есть байт с которого начинается t[0][0], почему нельзя без (int *) обойтись? Объясните пожалуйста что к чему?
Я имел ввиду, если не ссылаться указателем на двухмерный массив, а просто по его имени нельзя без (int *) вот так *((int *)t+N) и присвоить его адрес без (int *) не получается, кроме как напрямую &t[0][0];

Решение задачи: «Указатель на двухмерный массив»

textual
Листинг программы
int t[10][10];
int (*p)[10] = t;

Объяснение кода листинга программы

  1. Объявляется целочисленный двухмерный массив t размером 10x10.
  2. Указатель p типа int (*)[10] указывает на первый элемент массива t.
  3. Значение указателя p присваивается адресу первого элемента массива t.
  4. В данном случае, адрес первого элемента массива t равен адресу массива t.
  5. Указатель p может использоваться как массив 10-го размера, т.е. p[i][j] обращается к элементу t[i][j].

Оцени полезность:

8   голосов , оценка 3.625 из 5
Похожие ответы