提问者:小点点

从指针C++获取数组大小


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

下面是函数头:

int largest(int *list, int highest_index)

我如何获得数组'list'中的整数数。

我试过以下几种方法:

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

任何帮助都将不胜感激!


共1个答案

匿名用户

C++是基于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*”的大小--这是4或8个字节,取决于32位和64位。

相反,您需要接受大小参数

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(数组)/sizeof(*数组)

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(指针|c++|获取|数组|大小)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?