Подтвердить что ты не робот

Передача массивов в функцию на С++

#include <iostream>
using namespace std;

void printarray (int arg[], int length) {
    for (int n = 0; n < length; n++) {
        cout << arg[n] << " ";
        cout << "\n";
    }
}

int main ()
{
     int firstarray[] = {5, 10, 15};
     int secondarray[] = {2, 4, 6, 8, 10};
     printarray(firstarray, 3);
     printarray(secondarray, 5);

     return 0;
}

Этот код работает, но я хочу понять, как передается массив.

При вызове функции printarray из основной функции передается имя массива. Имя массива относится к адресу первого элемента массива. Как это соотносится с int arg[]?

4b9b3361

Ответ 1

Синтаксис

int[]

и

int[X] // Where X is a compile-time positive integer

Точно такие же, как

int*

Когда в списке параметров функции (я оставил необязательные имена).

Кроме того, имя массива распадается на указатель на первый элемент при передаче функции (и не передается по ссылке), поэтому оба int firstarray[3] и int secondarray[5] распадаются на int* s.

Также случается, что как разыменование массива, так и различие указателя с синтаксисом подстроки (синтаксис подстроки x[y]) дают значение lvalue одному элементу при использовании того же индекса.

Эти три правила объединяются, чтобы сделать код законным и работать так, как вы ожидаете; он просто передает указатели на функцию вместе с длиной массивов, которые вы не можете знать после разложения массивов указателями.

Ответ 2

Я просто хочу добавить это, когда вы получите доступ к позиции массива, например

arg[n]

совпадает с

*(arg + n)  чем означает смещение n, начинающееся с адреса arg.

поэтому arg[] будет *arg

Ответ 3

firstarray и secondarray преобразуются в указатель на int при передаче в printarray().

printarray(int arg[], ...) эквивалентно printarray(int *arg, ...)

Однако это не относится к С++. C имеет те же правила для передачи имен массивов в функцию.