Мой код довольно прост:
#include <iostream>
using namespace std;
int test(int b[]){
cout<<sizeof(b)<<endl;
return 1;
}
int main(){
int a[] ={1,2,3};
cout<<sizeof(a)<<endl;
test(a);
system("pause");
}
вывод этого кода:
12
4
это означает, что когда a [] передается как параметр функции test(), это ухудшилось как int *, поэтому выход размера (b) равен 4, а не 12. Так что мой вопрос в том, как можно Я получаю фактическую длину b [] внутри функции test()?
Вы можете сделать это с помощью шаблона функции:
#include <cstddef> // for std::size_t
template<class T, std::size_t N>
constexpr std::size_t size(T (&)[N])
{
return N;
}
тогда
#include <iostream>
int main()
{
int a[] ={1,2,3};
std::cout << size(a) << std::endl;
}
Обратите внимание, что в C и C++ int test(int b[])
- это еще один способ сказать int test(int* b)
, поэтому информация о размере массива внутри test
функции отсутствует. Кроме того, вы можете использовать стандартные типы контейнеров библиотеки, которые знают их размер, например std::array
.
std::array
илиstd::vector