Задан массив 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);
Сборка персонального компьютера от Artline: умный выбор для современных пользователей