C++ 如何找到int[]的大小?
我有 如何获取C++ 如何找到int[]的大小?,c++,arrays,C++,Arrays,我有 如何获取列表的大小 我知道对于char数组,我们可以使用strlen(array)查找大小,或者在数组末尾使用'\0'进行检查 正如一些答案所说,我尝试了sizeof(array)/sizeof(array[0]),但它只在main中起作用?例如: int list[] = {1, 2, 3}; 为什么?实现这一点的“标准”C方法是 int size(int arr1[]){ return sizeof(arr1) / sizeof(arr1[0]); } int main(
列表的大小
我知道对于char数组,我们可以使用strlen(array)
查找大小,或者在数组末尾使用'\0'
进行检查
正如一些答案所说,我尝试了sizeof(array)/sizeof(array[0])
,但它只在main中起作用?例如:
int list[] = {1, 2, 3};
为什么?实现这一点的“标准”C方法是
int size(int arr1[]){
return sizeof(arr1) / sizeof(arr1[0]);
}
int main() {
int list[] = {1, 2, 3};
int size1 = sizeof(list) / sizeof(list[0]); // ok
int size2 = size(list_1); // no
// size1 and size2 are not the same
}
试试这个:
sizeof(list) / sizeof(list[0])
因为这个问题是用C++来标记的,所以在C++中,总是建议使用<代码> STD::向量< /代码>,而不是使用传统的C样式数组。
将数组类型
传递给函数时,它会隐式转换为指针类型
。
看看
为了正确打印任何函数中数组的大小,请通过引用将数组传递给该函数(但需要事先知道该数组的大小)
一般情况下,你会这样做吗
sizeof(list) / sizeof(list[0]);
模板
//模板参数推导
int size(T(&arr1)[N])//通过引用传递数组
{
return sizeof(arr1)/sizeof(arr1[0]);//正确返回'list'的大小
//或
返回N;//也正确返回大小[cool trick;-)]
}
对于动态分配的数组(或指针),您不能这样做。对于静态数组,可以使用sizeof(array)
以字节为单位获取整个数组大小,并将其除以每个元素的大小:
template<typename T,int N>
//template argument deduction
int size(T (&arr1)[N]) //Passing the array by reference
{
return sizeof(arr1)/sizeof(arr1[0]); //Correctly returns the size of 'list'
// or
return N; //Correctly returns the size too [cool trick ;-)]
}
要获取动态数组的大小,您必须手动跟踪它并将其传递,或者使用sentinel值终止它(如以null结尾的字符串中的“\0”)
<强>更新:我意识到你的问题是C++的标签,而不是C。如果你想传递事物的话,你应该明确地考虑使用<代码> STD::向量< /代码>代替C++中的数组:
#define COUNTOF(x) (sizeof(x)/sizeof(*x))
std::vector v;
v、 推回(1);
v、 推回(2);
STD::CUT< P>除了卡尔的回答之外,“标准”C++方式不是使用C<代码> int 数组,而是像C++ STL<代码> STD::向量列表< /> >,可以查询List.siz()/< > > /p> ,基本上可以这样定义:
std::vector<int> v;
v.push_back(1);
v.push_back(2);
std::cout << v.size() << std::endl; // prints 2
模板
标准:大小(常数(&)[N])
{
返回N;
}
注意,如果你想使用这个大小作为常量表达式,你就必须使用<代码>一个[sixA/sixe[/]代码>习惯用法或等待下一个C++版本的版本。
,因为你已经把它标记为C++,值得一提的是,有一种比C风格宏:更好的方法。
template <typename T, std::size_t N>
std::size_t size(T const (&)[N])
{
return N;
}
在C++11或更新版本中,可以添加constexpr
以获取编译时常量:
int a[20];
char x[countof(a)];
模板
constexpr size_t countof(const t&array[N]){return N;}
如果您真的希望在较旧的编译器上支持相同的功能,那么有一种方法,最初由AFAIK的Ivan Johnson发明:
template <class T, size_t N>
constexpr size_t countof(const T &array[N]) { return N; }
定义(x)的计数(\
0*sizeof(重新解释铸造(x))+\
0*sizeof(::坏参数到计数::检查类型((x),&(x))+\
sizeof(x)/sizeof((x)[0]))
类别错误参数到计数
{
公众:
类是_指针;
类是_数组{};
模板
静态是指针检查类型(常数T*,常数T*常数*);
静态是数组检查类型(常量无效*,常量无效*);
};
它使用sizeof(x)/sizeof(x[0])来计算大小,就像C宏一样,因此它提供了一个编译时常量。区别在于,如果传递的不是数组的名称,它首先使用一些模板魔术来导致编译错误。它通过重载check_type为指针返回一个不完整的类型,但为数组返回一个完整的类型。然后(真正棘手的部分)它实际上根本不调用该函数——它只接受函数将返回的类型的大小,对于返回完整类型的重载为零,但对于不完整类型则不允许(强制编译错误)
在我看来,这是一个非常酷的模板元编程的例子——尽管老实说,结果是毫无意义的。如果使用数组,实际上只需要将该大小作为编译时常量,在任何情况下通常都应该避免使用数组。使用std::vector
,可以在运行时提供大小(并在需要时调整向量大小)。将任何数组传递给某个函数时。你只是传递它的起始地址,所以为了让它工作,你必须传递它的大小,也为了它正常工作。这与我们在命令行参数中用argv[]传递argc的原因相同。您必须使用sizeof()函数
代码段:
#包括
使用名称空间std;
int main()
{
ios::与stdio同步(false);
int arr[]={5,3,6,7};
int size=sizeof(arr)/sizeof(arr[0]);
库特
基本上,sizeof(arr1)给出了所指向对象的大小,每个元素可能占用多个位,因此除以每个元素的位数(sizeof(arr1[0])提供您正在查找的元素的实际数量,即我的示例中的4个。此方法在您使用类时有效:在本示例中,您将收到一个数组,因此对我有效的唯一方法是以下方法:
int arr1[] = {8, 15, 3, 7};
int n = sizeof(arr1)/sizeof(arr1[0]);
模板
矩阵与算子=(T(&a)[n][m])
{
int arows=n;
int acols=m;
p=新双*[arows];
for(寄存器int r=0;r
}
您可以制作一个模板函数,并通过引用传递数组来实现这一点
这是我的代码片段
template <typename T, size_t n, size_t m>
Matrix& operator= (T (&a)[n][m])
{
int arows = n;
int acols = m;
p = new double*[arows];
for (register int r = 0; r < arows; r++)
{
p[r] = new double[acols];
for (register int c = 0; c < acols; c++)
{
p[r][c] = a[r][c]; //A[rows][columns]
}
模板
无效打印数组(数据类型和数组类型);
int main()
{
charchararray[]=“我的名字是”;
int intArray[]={1,2,3,4,5,6};
双双数组[]={1.1,2.2,3.3};
打印阵列(charArray);
打印阵列(intArray);
打印阵列(双阵列);
}
模板
vo
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int arr[] ={5, 3, 6, 7};
int size = sizeof(arr) / sizeof(arr[0]);
cout<<size<<endl;
return 0;
}
int arr1[] = {8, 15, 3, 7};
int n = sizeof(arr1)/sizeof(arr1[0]);
template <typename T, size_t n, size_t m>
Matrix& operator= (T (&a)[n][m])
{
int arows = n;
int acols = m;
p = new double*[arows];
for (register int r = 0; r < arows; r++)
{
p[r] = new double[acols];
for (register int c = 0; c < acols; c++)
{
p[r][c] = a[r][c]; //A[rows][columns]
}
template <typename TypeOfData>
void PrintArray(TypeOfData &arrayOfType);
int main()
{
char charArray[] = "my name is";
int intArray[] = { 1,2,3,4,5,6 };
double doubleArray[] = { 1.1,2.2,3.3 };
PrintArray(charArray);
PrintArray(intArray);
PrintArray(doubleArray);
}
template <typename TypeOfData>
void PrintArray(TypeOfData &arrayOfType)
{
int elementsCount = sizeof(arrayOfType) / sizeof(arrayOfType[0]);
for (int i = 0; i < elementsCount; i++)
{
cout << "Value in elements at position " << i + 1 << " is " << arrayOfType[i] << endl;
}
}
int arraylength(int array[]) {
return sizeof(array) / sizeof(int); // Size of the Array divided by the int size
}
int array_size(int array[]) {
if(sizeof(array) == 0) {
return 0;
}
return sizeof(array)/sizeof(array[0]);
}