Почему можно указать размер массива в параметре функции?

Я не понимаю почему следующие компиляции в качестве примера и работы:

void printValues(int nums[3], int length) {
    for(int i = 0; i < length; i++) 
        std::cout << nums[i] << " ";
    std::cout << '\n';
}

Кажется, что размер 3 полностью проигнорирован, но помещение недопустимого размера приводит к ошибке компиляции. Что продолжается здесь?

7
задан defectivehalt 16 February 2010 в 21:05
поделиться

3 ответа

В C ++ (а также в C) параметры объявлены с типом массива всегда немедленно распадаются на тип указателя. Следующие три объявления эквивалентны

void printValues(int nums[3], int length);
void printValues(int nums[], int length);
void printValues(int *nums, int length);

Т.е. размер значения не имеет. Тем не менее, это все еще не означает, что вы можете использовать там недопустимое объявление массива, т.е. недопустимо указывать, например, отрицательный или нулевой размер.

(Кстати, то же самое относится к параметрам типа функции - он немедленно распадается на тип указателя на функцию.)

Если вы хотите принудительно согласовать размер массива между аргументами и параметрами, используйте указатель или ссылку на Типы -array в объявлениях параметров

void printValues(int (&nums)[3]);
void printValues(int (*nums)[3]);

Конечно, в этом случае размер станет константой времени компиляции, и нет смысла передавать length больше.

11
ответ дан 6 December 2019 в 23:04
поделиться

Я не понимаю, о какой ошибке компиляции вы говорите - массивы, переданные в функцию , распадаются на указатели, и вы теряете информацию о типе массива. Вы также могли бы использовать:

void printValues(int* nums, int length);

Вы можете избежать распада указателей, используя ссылки:

void printValues(int (&nums)[3], int length);

Или просто используйте указатели, если вам не нужны массивы фиксированного размера.

2
ответ дан 6 December 2019 в 23:04
поделиться

Размер массива не игнорируется, он является частью типа аргумента. Вы должны получить ошибку компилятора, если попытаетесь передать в функцию массив любого другого размера.

С другой стороны, C и C ++ не выполняют проверку границ при доступе к массиву, поэтому в этом смысле они игнорируются. Но это верно и для любого другого контекста, а не только для параметров функции.

-2
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: