2013-05-25 3 views
10

Я видел, что значения массива будут меняться, если параметр функции «int arr []» или «int * arr». Где разница?Разница между int * array и int array [] в параметре функции

целочисленный массив []:

void myFunction(int arr[], int size) { 

    for (int i = 0; i < size; ++i) 
     arr[i] = 1; 
} 

INT * массив:

void myFunction(int * arr, int size) { 

    for (int i = 0; i < size; ++i) 
     arr[i] = 1; 
} 

Обе функции изменяют значения массива.

int main(){ 

    int array[3]; 

    array[0] = 0; 
    array[1] = 0; 
    array[2] = 0; 

    myFunction(array, 3); 

    return 0; 

} 
+1

посмотрите на это http://stackoverflow.com/questions/5491789/any-difference-between-fooint-arr-and-fooint-arr – Rohan

+6

Нет разницы. Вообще. _ В списке параметров function_, 'int arr []' - не что иное, как «альтернативная» запись для 'int * arr'. (И поэтому вы можете увидеть 'int main (int argc, char * argv [])' или 'int main (int argc, char ** argv)'.) Даже если вы должны были положить число внутри скобок !: в 'void f (int a [10])' '' 10' полностью ** игнорируется **, что означает 'void f (int a [])', то есть 'void f (int * a)'. –

+0

И как сказано в ответах, для вызова 'myFunction (array, 3);' ваш массив неявно преобразован в _pointer_ в свой первый элемент и этот указатель передается функции (с записью параметра), так как если вы вызвали 'myFunction (& (array [0]), 3);'. Один способ действительно передать массив (на самом деле, _reference_ к нему) - написать такую ​​функцию, как 'template void g (int (& arr) [size])', что позволяет называть его следующим образом: 'g (array) ; '. –

ответ

4

Нет никакой разницы. Оба типа функций (после регулировки) являются «функцией, принимающей указатель на int и int, возвращающий void». Это просто синтаксическая причуда C++: внешний [] в функциональном параметре не ссылочного типа является синонимом *.

0

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

-2

Когда вы передаете массив функциям, он неявно передает его указателем. потому что, если в массиве передается много элементов по копированию значений, это огромные накладные расходы. даже, хотя он выглядит по-другому.

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

+0

Я знаю, я знаю, это был просто пример^^. – Alex

+0

Причина, по которой вы заявляете, - это просто спекуляция. – EJP

-3

Нет никакой разницы. На самом деле объявление массива возвращает allawys указатель. Только, когда вы указываете в объявлении, что переменная является массивом (т. Е. С []), нет необходимости указывать, что это будет указатель, потому что это делается неявно. Но если вы не укажете это, вы должны объявить его как указатель, если вы повлияли на него как на переменную таблицы, так и на результат «new []». Использование указателей таблицы имеет интерес только для динамического распределения, когда размер массива неизвестен во время разработки.

+0

Это неправда. «объявление массива возвращает allawys указатель» - это просто неправильно. Тип 'a' в' int a [10]; 'очень отличается * от типа' a' в 'int * a;' – Angew