Передача массивов в функцию на С++
#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[]
?
Ответы
Ответ 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 имеет те же правила для передачи имен массивов в функцию.