Не работает указатель на двумерный массив

  • Автор темы OverCplusplus
  • Дата начала
O

OverCplusplus

Привет. У меня в книжке написано:
4.6. Указатели и многомерные массивы
Для начала рассмотрим пример объявления двумерного массива:
...
int mas[4][2];
int *ptr;
...
Тогда выражение рtr=mas указывает на первый столбец первой строки матрицы. Записи mas и &mas[0][0] равносильны. Выражение рtr+ 1 указывает на mas[0][1], далее идут элементы: mas[1][0], mas[1][1], mas[2][0] и т. д.; ptr+5 указывает на mas[2][1].
...
Пишу я программу - не работает.
К примеру:
<!--shcode--><pre><code class='С++'>#include<iostream>
using namespace std;
int main()
{
int test[2][10]={
{1,2,3,4,5,6,7,8,9,10},
{1,2,3,4,5,6,7,8,9,10}
};
int *t,*e;
t=test; e=&test[1][10];
while(t<=e)
{
cout<<*t;
t++;
}
}[/CODE]
В программе один указатель указывает на начало массива, второй на конец, и с помощью цикла cout выводит элементы массива на экран, пока не будет достигнут конец массива.
По идее, согласно книге в записе t=test ничего плохого нет... компилятор ругается: невозможно преобразовать
невозможно преобразовать 'int [2][10]' в 'int *' Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
Люди, что я сделал или понял не так, помогите пожалуйста.
 
G

grigsoft

Книжка или старая, или неточная. Хотя любопытно, работало ли это раньше, учитывая что С++ идет ко все более сильному контролю типов. Проблема здесь в том, что хотя реально test есть указатель на первый элемент массива, формально test[0] есть int[], а t[0] это int, отсюда и несовместимость типов. С точки зрения типов, int test[][] это int** test; поэтому и нельзя это присвоить int *t.
 
O

OverCplusplus

Сделал t=&test[0][0] - заработало. Спасибо.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!