23

我正在编写一个简单的函数,它返回数组中的最大整数。我遇到的问题是查找数组中元素的数量。

这是函数头:

int largest(int *list, int highest_index)

如何获取数组“列表”中的整数个数。

我尝试了以下方法:

int i = sizeof list/sizeof(int); //returns incorrect value
int i = list.size(); // does not compile

任何帮助将不胜感激!

4

5 回答 5

30

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]);

http://ideone.com/gaSl6J

还记得我说过数组不是指针,而是等价的吗?

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)

于 2013-11-10T20:37:57.493 回答
10

没有办法做到这一点。这是使用向量而不是数组的一个很好的理由(在众多理由中)。但是如果你必须使用一个数组,那么你必须将数组的大小作为参数传递给你的函数

int largest(int *list, int list_size, int highest_index)

C++ 中的数组很差,越早学会使用向量就越容易找到东西。

于 2013-11-10T20:25:20.187 回答
4

简单的答案是你不能。您需要将其存储在变量中。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

未测试。但是,应该工作。;)

于 2013-11-10T20:28:16.230 回答
3

指针没有关于它们引用的元素数量的信息。如果您正在谈论函数调用的第一个参数,那么如果 list 是一个数组,您确实可以使用语法

sizeof( list ) / sizeof( int )

我想补充一下,有三种方法。第一个是使用通过引用传递的数组。第二个是使用指向第一个元素的指针和元素的数量。第三种是使用两个指针——开始指针和结束指针作为标准算法通常被定义。字符数组有额外的可能性来处理它们。

于 2013-11-10T20:26:53.357 回答
2

您需要记住在可变数组大小中,不可能从指针中检索数组大小。

const int SIZE = 10;
int list[SIZE];
// or
int* list = new int[SIZE];  // do not forget to delete[]
于 2013-11-10T20:26:15.360 回答