2015-01-18 3 views
0

В чем разница, если она существует, между «double a []» и «double * a» при передаче аргументов в C++-функциях? Я имею в виду, эти две функции одинаково похожи?В чем разница между «double a []» и «double * a» при передаче аргументов в C++-функциях?

void do_somethingA (double a[], size_t size_a) 
{ 
    // ... do something 
} 

void do_somethingB (double *a, size_t size_a) 
{ 
    // ... do something 
} 

int main() 
{ 
    double X[] = {1.,2.,3.,4.,5.}; 
    double *Y; 
    Y = new double[5]; 
    for(int i = 0; i < 5; i++) 
     Y[i] = (double) i; 
    do_somethingA(X,5); 
    do_somethingA(Y,5); 
    do_somethingB(X,5); 
    do_somethingB(Y,5); 
    delete [] Y; 
} 

Ошибка приведенного кода. Мне просто интересно об этом, и я не мог найти способ «google», извините.

Я передаю как статические, так и динамические массивы в качестве аргументов для функций, из которых используется «double a []», а другой использует «double * a», и все компилируется и выполняется отлично. Это только вопрос стиля?

+0

на самом деле тот же. Когда вы передаете массив функции в качестве параметра, то, что вы действительно передаете, является адресом первого элемента массива, который является синонимом a или a [0]. – blade

+0

@blade нет, если вы передадите его по ссылке – vsoftco

ответ

5

В этом контексте double a[] и double *a определены как абсолютно, на 100% идентичные. Это вопрос C++, но значение C FAQ по-прежнему актуально.


От стандарта C++ 11:

8.3.5

После определения типа каждого параметра, любого параметра типа "массив T" или " возвращаемая функция T "настраивается на " указатель на T " или" указатель на функцию, возвращающую T "соответственно.

+1

Однако вы можете передать ссылку на массивы, которые, по крайней мере, сохранят семантику размера. – BlamKiwi

+0

Спасибо, @cnicutar, специально для ссылки _C FAQ_! Я выбираю этот ответ из-за ссылки, но у всех ответов есть что добавить к обсуждению. :-D – iperetta

1

Массивы прошли тление значения для указателей, так что в вашем случае double a[] (или даже double a[256]) просто синтаксический сахар для double* a. Однако массивы не являются указателями, и разница возникает, когда вы передаете массивы по ссылке. В этом случае вы можете даже вывести их размер, например:

#include <iostream> 
#include <cstddef> 

template<typename T, std::size_t N> 
std::size_t get_arr_size(T (&arr)[N]) // pass array by reference 
{ 
    return N; 
} 

int main() 
{ 
    int arr[] = {1,2,3,4}; 
    int* p = new int[256]; 
    std::cout << get_arr_size(arr) << std::endl; // displays 4 
    // std::cout << get_arr_size(p) << std::endl; // does not compile, not the same as array 
    delete[] p; 
} 
+0

Спасибо, @vsoftco! Мне понравился ваш пример, потому что я мог видеть возможную разницу между статическими и динамическими массивами в качестве аргументов. – iperetta

2

Семантически, есть разница.

Для читателя функция, требующая double a[], ожидает массив.

Функция, требующая double * a, является указателем на одно или несколько значений double. Существует некоторая двусмысленность относительно того, будет ли функция работать более чем на одном смежном double. Весь читатель может предположить, что один двойной, на который указывает данный указатель *, может быть доступен; читатель не может предположить, что требуется массив из double.

См. Также инструкции по кодированию MISRA C и MISRA C++.

+0

Я согласен с тобой @ThomasMatthews. Семантически это могло помочь понять. – iperetta

Смежные вопросы