2013-07-24 4 views
1

Я пытался пропустить массивы C++ в качестве аргументов в C++ и столкнулся с некоторыми проблемами. Я прошел через this и до сих пор не смог решить проблему.Передача массива в качестве аргументов в C++

C++ 
#include<iostream> 
using namespace std; 

void comb(int a[]) 
{ 
    int alen = sizeof(a)/sizeof(*a); 
    cout << alen << endl; 
    /* Since 'I' know the size of a[] */ 
    for(int i = 0; i < 7; i++) 
    cout << a[i] << " "; 
    cout << endl; 
} 

int main() 
{ 
    int a[] = {1,2,3,4,5,6,7}; 
    comb(a); 
} 

Output 
2 
1 2 3 4 5 6 7 

Вопрос в том, как размер массива вычисляется как 2?

+0

Как получается выход 2? –

+1

Если размер указателя в два раза больше размера 'int' –

+0

Не должна ли логика быть' sizeof (a)/sizeof (a [0]) '? – syb0rg

ответ

6

Когда вы указываете массив как аргумент функции, он ухудшается до указателя. Таким образом, sizeof(a) - размер указателя, не (байтовый) размер массива. Вам нужно передать длину в виде отдельного аргумента или использовать что-то вроде std::vector.

+4

Или используйте шаблон или используйте 'std :: array'. – chris

+0

Или ссылка на массив/указатель. Но std :: vector должен быть по умолчанию. Первое правило массивов - «Не использовать массивы». Для завершения: 'void comb (int (& a) [7])' или 'void comb (int (* a) [7])'. «7» можно вывести с помощью шаблона, как указано выше. –

+0

Спасибо. Я использовал вектор и внедрил его правильно. –

1

C не сохраняет длину массива в памяти, поэтому вызываемая функция не имеет никакого способа узнать, сколько времени находится в массиве.

sizeof оценивается во время компиляции, если вы не примените его к литералу массива, вы не получите длину массива.

Возможно, вы захотите передать std::vector<int> по ссылке.

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