我正在编写一个简单的函数,它返回数组中的最大整数。我遇到的问题是查找数组中元素的数量。
这是函数头:
int largest(int *list, int highest_index)
如何获取数组“列表”中的整数个数。
我尝试了以下方法:
int i = sizeof list/sizeof(int); //returns incorrect value
int i = list.size(); // does not compile
任何帮助将不胜感激!
C++ 基于 C 并继承了许多特性。关于这个问题,它继承了称为“数组/指针等价”的东西,这是一个允许数组衰减为指针的规则,尤其是在作为函数参数传递时。这并不意味着数组是一个指针,它只是意味着它可以衰减为一个。
void func(int* ptr);
int array[5];
int* ptr = array; // valid, equivalent to 'ptr = &array[0]'
func(array); // equivalent to func(&array[0]);
最后一部分与您的问题最相关。您没有传递数组,而是传递了第 0 个元素的地址。
为了让您的函数知道传入数组有多大,您需要将该信息作为参数发送。
static const size_t ArraySize = 5;
int array[ArraySize];
func(array, ArraySize);
因为指针不包含大小信息,所以不能使用 sizeof。
void func(int* array) {
std::cout << sizeof(array) << "\n";
}
这将输出“int*”的大小——取决于 32 位还是 64 位,它是 4 或 8 个字节。
相反,您需要接受尺寸参数
void func(int* array, size_t arraySize);
static const size_t ArraySize = 5;
int array[ArraySize];
func(array, ArraySize);
即使您尝试传递一个固定大小的数组,事实证明这是语法糖:
void func(int array[5]);
还记得我说过数组不是指针,而是等价的吗?
int array[5];
int* ptr = array;
std::cout << "array size " << sizeof(array) << std::endl;
std::cout << "ptr size " << sizeof(ptr) << str::endl;
数组大小将为 5 * sizeof(int) = 20 ptr 大小将为 sizeof(int *) ,即 4 或 8 字节。
sizeof 返回所提供类型的大小,如果您提供一个对象,那么它会推导出类型并返回该类型的大小
如果你想知道数组中有多少元素,当你有数组而不是指针时,你可以写
sizeof(array) / sizeof(array[0])
或 sizeof(array) / sizeof(*array)
没有办法做到这一点。这是使用向量而不是数组的一个很好的理由(在众多理由中)。但是如果你必须使用一个数组,那么你必须将数组的大小作为参数传递给你的函数
int largest(int *list, int list_size, int highest_index)
C++ 中的数组很差,越早学会使用向量就越容易找到东西。
简单的答案是你不能。您需要将其存储在变量中。C++ 的最大优势是它具有 STL,并且您可以使用向量。size() 方法给出了该时刻向量的大小。
#include<iostream>
#include<vector>
using namespace std;
int main () {
vector<int> v;
for(int i = 0; i < 10; i++) {
v.push_back(i);
}
cout << v.size() << endl;
for(int i = 0; i < 10; i++) {
v.push_back(i);
}
cout << v.size() << endl;
return 0;
}
输出:
10
20
未测试。但是,应该工作。;)
指针没有关于它们引用的元素数量的信息。如果您正在谈论函数调用的第一个参数,那么如果 list 是一个数组,您确实可以使用语法
sizeof( list ) / sizeof( int )
我想补充一下,有三种方法。第一个是使用通过引用传递的数组。第二个是使用指向第一个元素的指针和元素的数量。第三种是使用两个指针——开始指针和结束指针作为标准算法通常被定义。字符数组有额外的可能性来处理它们。
您需要记住在可变数组大小中,不可能从指针中检索数组大小。
const int SIZE = 10;
int list[SIZE];
// or
int* list = new int[SIZE]; // do not forget to delete[]