Я хочу следующее
int ring1[5] = {1,2,3,4,5};
int ring2[5] = {6,7,8,9,10};
int ring3[5] = {11,12,13,14,15};
int rings[3][5] = {ring1, ring2, ring3};
Но я получаю ошибку в последней строке:
Массив Должен быть инициализирован с помощью инициализатора, заключенного в фигурные скобки.
Массивы не могут быть скопированы путем присваивания. Их можно копировать с помощью memcpy
или поэлементно в цикле. Вы можете превратить rings
в массив указателей, например. int *rings[3] = {ring1, ring2, ring3};
, но обратите внимание, что любые изменения ring1[i]
также изменят rings[0][i]
и наоборот. Аналогично для ring2
и ring3
.
обман объявления и назначения массива C? и др.
Ошибка вводит в заблуждение, вы компилируете с помощью компилятора C++
?
@IrAM Arduino — это квази-C++, так что да.
В C
имя массива указывает базовый адрес массива, поэтому все ваши ring1
, ring2
и ring3
дают адрес своего начального элемента (т.е. 0-й).
Точно так же rings
также является массивом (это двумерный массив).
Мы не можем хранить адреса в массивах, для этого придется использовать указатели.
Поэтому мы должны использовать способ ниже.
#include <stdio.h>
int main()
{
int ring1[5] = {1,2,3,4,5};
int ring2[5] = {6,7,8,9,10};
int ring3[5] = {11,12,13,14,15};
//int rings[3][5] = {{ring1}, {ring2}, {ring3}};
int *rings[3] = {ring1, ring2, ring3};
printf("ring1 = %p and rings[0] =%p\n", ring1, rings[0]);
printf("ring2 = %p and rings[1] =%p\n", ring1, rings[1]);
printf("ring3 = %p and rings[2] =%p\n", ring1, rings[2]);
return 0;
}
Да, но при этом теряется информация о размере «вложенных» массивов и другие проблемы, связанные с использованием указателей. Менее прямое, но более правильное исправление состояло бы в повторении и назначении подмассивов IMO.
Пришло время открыть учебник по главам, посвященным указателям.