2015-10-25 3 views
0

Предположим, у меня есть функцияВопросы по типу массива

void function(double p[2]) { 
    cout << p[0] << " " << p[1] << endl; 
} 

Если я пытаюсь что следующий код

double a[1] = {1}; 
double b[2] = {2, 3}; 
double c[3] = {4, 5, 6}; 
function(a); 
function(b); 
function(c); 

я получаю что-то вроде

1 2.0778e-317 
2 3 
4 5 

Другими словами, 2, кажется, полностью игнорируется, и все 3 массива все равно передаются функции.

Являются ли следующие точно такими же?

void function(double p[2]) 
void function(double p[]) 
void function(double *p) 

Если они есть, есть ли способ, чтобы сделать функцию, которая будет принимать только массив определенной длины или, по крайней мере, определенной длины? Я прошу, чтобы типы a, b и c оказались разными. (Вы получаете разные результаты для typeid(a).name() и typeid(b).name() например).

+0

Чтобы избежать распада вы можете получить ссылку на массив или указатель на массив, но это странно, в C++: 'недействительными функции (двойной (& р) [2]),' аннулируются функция (двойной (* р) [2]) '. – rodrigo

+0

@rodrigo Как я могу назвать эти функции с помощью 'b'? –

+1

Эталонная функция будет просто 'function (b)' и указателем one 'function (& b)'. Но если вы хотите передать 2 первых значения аргумента 'c' в качестве аргумента (что опытный разработчик C++ захочет сделать), вам придется делать некоторые неприятные броски. – rodrigo

ответ

4

Они такие же. Параметр функции массива получает с поправкой на указатель. Вся информация, связанная с длиной массива, теряется.

Если бы вы попытались определить эти три функции, вы получите несколько ошибок определения:

void function(double p[2]) {} // defines void function(double*) 
void function(double p[]) {} // ERROR 
void function(double *p) {} // ERROR 

Это заблуждение особенность языка унаследованных от С.

Для применения, что функция только принимает аргументы массив определенного типа, вы можете использовать ссылку на массив:

void function(const double(&p)[2]); 

Обратите внимание, что настройки параметров не совпадает с массивом распад. Распад массива - это то, что происходит, когда вы вызываете function с именем массива в качестве аргумента или когда вы просто назначаете массив указателю.

double a[42] = {}; 
function(a); // a decays to double* 
double * b = a; // a decays to double* 
+0

Спасибо за ответ. Таким образом, факт, что вы получаете разные результаты для 'typeid (a) .name()' и т. Д., Не означает, что существует какой-либо способ объявить переменную или параметр типа типа A2_d? –

+0

@PaulBoddington Правильно. На самом деле, я признаю, что удивляюсь, что это создает разные идентификаторы типов. – juanchopanza

+0

Вы можете объявить ссылку на массив, который сохраняет информацию о размере. –

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