Как сделать тоже самое с помощью адресации?

244
23 марта 2018, 12:56

Задан массив char str[stolb][dlina]; а также:

int length = 0; char s[100]; str[i][j] = s[length];

Хочу сделать тоже самое с помощью адресации, пишу следующее:

*(str+i+j) = *(s+length);

Компилятор ругается:

[Error] incompatible types in assignment of 'char' to 'char [dlina]'

Что я делаю не так? Не понимаю, как устроен двумерный массив в памяти. Прошу объяснить это, а также рассказать на данном примере, что я делаю неправильно.

Answer 1

Посмотрите сами - если бы ваша запись была верна, то str[1][5], скажем, было бы обязано быть равно str[5][1]. Двумерный массив располагается в памяти построчно - в вашем случае dlina элементов str[0], dlina элементов str[1], и так далее.

Так что делать то, что вы хотите, нужно примерно так:

const int stolb = 3, dlina = 5;
char str[stolb][dlina];
int length = 0; char s[100];
int i, j;
*((char*)str+i*dlina+j) = *(s+length);
Answer 2

n-мерный массив — это одномерный массив, элементами которого являются n-1-мерные массивы.

В вашем случае, str на самом деле является одномерным массивом из stolb элементов, которые в свою очередь являются одномерными массивами из dlina элементов типа char.

Чтобы "добраться" до элемента двумерного массива можно рассуждать следующим образом.

Если у нас есть двумерный массив:

str

То мы можем получить указатель на i-тый элемент этого массива, т.е. указатель на массив из dlina элементов типа char:

str + i

Разыменовываем предыдущий указатель, т.е. получаем массив из dlina элементов типа char:

*(str + i)

Именно на этом этапе у вас и возникли затруднения. С помощью кода *(str+i+j) = *(s+length); вы пытаетесь присвоить объекту типа массив, объект типа char. Так делать нельзя, о чём вам и сообщил компилятор.

Продолжим "добираться" до элемента двумерного массива.

Если у нас есть массив, то мы можем получить указатель на j-тый элемент этого массива, т.е. указатель на char:

*(str + i) + j

Ну и наконец, имея указатель на char, мы можем его разыменовать, т.е. мы можем обратиться к объекту типа char:

*(*(str + i) + j)

Таким образом, эквивалент записи

str[i][j] = s[length];

выглядит так:

*(*(str + i) + j) = *(s + length);
READ ALSO
Console Diary - дневник в консоли

Console Diary - дневник в консоли

Сделал свой второй небольшой, но интересный проект, дневник в консолиВсе записи сохраняются в файлах с именами по дате создания

180
Метод сортировки “Шейкерный” (C++)

Метод сортировки “Шейкерный” (C++)

Доброго времени сутокЕсть такая задача:

222
Заполнение области сферами

Заполнение области сферами

Существуют ли готовые алгоритмы по заполнению области сферами различных радиусов?

161
Тип переменной во время компиляции или выполнения?

Тип переменной во время компиляции или выполнения?

Здравствуйте, подскажите пожалуйста: почему в данной случае тип переменных i, j известен на этапе компиляции

137