Задан массив 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]'
Что я делаю не так? Не понимаю, как устроен двумерный массив в памяти. Прошу объяснить это, а также рассказать на данном примере, что я делаю неправильно.
Посмотрите сами - если бы ваша запись была верна, то 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);
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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Сделал свой второй небольшой, но интересный проект, дневник в консолиВсе записи сохраняются в файлах с именами по дате создания
Существуют ли готовые алгоритмы по заполнению области сферами различных радиусов?
Здравствуйте, подскажите пожалуйста: почему в данной случае тип переменных i, j известен на этапе компиляции