2011-12-29 1 views
0

Эта проблема прослушивала меня с навсегда. У меня есть массив и в области его объявления я могу использовать оператор sizeof для определения количества элементов в нем, но когда я передаю его функции, он интерпретирует как просто указатель на начало массива и sizeof оператор просто дает мне размер этой переменной указателя. Как показано в следующем примере,Передача параметров и область видимости массива в C/C++

#include<iostream> 
int count(int a[]){ 
    return (sizeof(a)/sizeof(int)); 
} 
int main(){ 
    int a[]={1,2,3,4,5}; 
    std::cout << sizeof(a)/sizeof(int) << " " << count(a) << std::endl; 
    return 0; 
} 

Выходной код 5 2. Как я передаю массив функции, чтобы я мог определить ее размер с помощью только оператора sizeof и не нужно будет передавать дополнительный размер в качестве параметра этой функции?

+4

Рассмотрите также 'std :: array' (вам понадобится компилятор C++ 11). – jrok

+1

Если у вас нет C++ 11, вы можете просто использовать 'boost :: array', что более или менее то же самое – Grizzly

ответ

6
template<size_t N> 
int count(int (&a)[N]) 
{ 
    return N; 
} 
+0

thanx Benjamin. можете ли вы сказать мне, как сделать то же самое в c. –

+5

@sidharthsharma: Нет, я не могу. –

+0

@sidharth sharma: не может быть сделано, как описано в C. Массивы ** распадаются ** на указатель при передаче как аргумент функции (и во многих других случаях). Поэтому вам нужно явно передать размер. –

1

Вы не можете этого сделать. Нет способа передать массив, который заставит его нести информацию о своем размере. Вы должны сделать это сами. Вы должны передать счет в качестве дополнительного параметра.

+0

Это неправда - см. Ответ Бенджамина – Flexo

+0

@awoodland Но это обман, не так ли? Он работает только в том случае, если объявление с явным измерением массива находится в области видимости. Это не сработает, если у меня есть 'int myfunction (int [] a)'. –

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