Вот вам
#include <stdio.h>
// sets the 2 element of i to 5
void setToFive(int *i){
i[2] = 5;
printf("hello\n");
}
int main(){
int i[10];
setToFive(i);
printf("%d\n", i[2]);
}
Если вы хотите изменить элементы массива, просто передайте его по значению. В этом случае указатель массива неявно преобразуется в указатель на его первый элемент. Используя указатель и арифметику указателя c, вы можете изменить любой элемент массива.
Фактически в этом случае вы передаете элементы массива по ссылке косвенно через указатель на них.
Обратите внимание на то, что эти объявления функций
void setToFive(int i[100]);
void setToFive(int i[10]);
void setToFive(int i[1]);
void setToFive(int i[]);
эквивалентны и объявляют одно и то же объявление функции, которое компилятор настраивает на следующее объявление
void setToFive(int *i);
То есть в результате функция имеет дело с указателем.
Что касается выражения, используемого в качестве аргумента в этом вызове функции
setToFive(&i);
, то оно имеет тип int ( * )[10]
, поскольку указанный массив объявлен как
int i[10];
Это не то же самое, что тип параметра int *i[10]
, который, как я уже писал, корректируется компилятором для типа int **
.