Можно подумать, что в строке 1 создается ссылка для 0-й записи в foo
. Однако C ++ работает не так. Скорее, оператор присваивания (=
) вызывает операцию копирования. Таким образом, C ++ интерпретирует строку 1 как директиву для копирования элементов foo[0]
в новый массив с неправильным названием foo_alias_compile_error
.
Это не то, что имелось в виду - кто-то хотел ссылку, а не копию. Итак, хорошо, что C ++ вызвал ошибку по несвязанной причине и спас ее от себя.
@ FrançoisAndrieux предлагает жизнеспособное решение. Вот более полный пример, показывающий, что ссылка (не копия) может быть сделана с помощью int (&foo_reference)[10] = foo[0];
.
int foo[10][10];
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < 10; ++j) {
foo[i][j] = i + j * 10;
}
}
int (&foo_reference)[10] = foo[0];
for (int j = 0; j < 10; ++j) {
foo_reference[j] = 100 + j;
}
for (int i = 0; i < 10; ++i) {
printf("foo [0][%i] is %i\n", i, foo[0][i]);
printf("foo_refer[%i] is %i\n", i, foo_reference[i]);
}
Фрагмент вывода
foo [0][0] is 100
foo_alias[0] is 100
foo [0][1] is 101
foo_alias[1] is 101
foo [0][2] is 102
foo_alias[2] is 102
foo [0][3] is 103
foo_alias[3] is 103
Побочное примечание
Стоит отметить, что функции, которые принимают массивы в качестве аргументов, неявно преобразуют свои аргументы массива в указатели (как показано в строке 3). Итак, это одна из причин, почему кто-то может неправильно думать, что что-то вроде строки 1 должно работать.
Другими словами, следующий код
void barz(int arg[]) {
arg[2] = 99999;
}
int another_array[] = {0, 1, 2, 3, 4};
barz(another_array);
printf("another_array[2] is %i\n", another_array[2]);
"Правильно" печатает 99999
, а не 2
.