Предположим, мы объявляем массив int
:
int values[10];
В стеке выделен блок памяти на 10 дюймов, а переменная values
содержит адрес начала этого блока. памяти, или, другими словами, адрес нулевого элемента массива, который является одним и тем же.
Таким образом,
&values[0] == values
всегда верно.
Аналогично, эти два оператора обращаются к одному и тому же элементу
cout << values[5];
cout << *(values + 5);
Таким образом, если у нас есть параметр функции (или любая другая переменная), он может быть объявлен как тип int*
или int[]
и оба примет values
, потому что оба объявления - просто альтернативные способы объявления одного и того же - указателя. .
Это может вызвать путаницу, поскольку оба эти вызова к foo()
являются действительными:
void foo (int[] vals);
int values[10];
foo (values); // Passing an array
int x = 0;
int* px = &x:
foo (px); // Passing a single object by address
Так что для стиля, если функция ожидает массив, она должна принять массив для (int[]
) и длина. Если он ожидает один объект, он должен взять указатель (int*
).