当前位置: 首页 > 知识库问答 >
问题:

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

乐正德华
2023-03-14

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

下面是函数头:

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个答案

杜阳炎
2023-03-14

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

 类似资料:
  • 我想知道我是否可以自动推断数组的大小,它作为模板参数传递,而不(显式地)传递它的大小。 null

  • C++ 指针 在我们讲解指针数组的概念之前,先让我们来看一个实例,它用到了一个由 3 个整数组成的数组:#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; for (int i = 0; i < MAX; i++) { cout << "Va

  • C++ 指针 指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。请看下面的程序:#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *pt

  • C++ 数组 您可以先跳过本章,等了解了 C++ 指针的概念之后,再来学习本章的内容。 如果您对 C++ 指针的概念有所了解,那么就可以开始本章的学习。数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中: double balance[50]; balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把 p 赋值

  • 如何精确地找到数组的大小?我读了geeksforgeeks的解释,仍然有点困惑。我想如果你取消引用(&arr+1),那么它会给你一个不存在的值,因为你跳过了前面的6个整数,这可能是内存地址中的任何随机值?而且,如果您能够取消对int类型的引用(&arr+1),那么您如何能够从中减去该值呢?

  • 问题内容: 我正在使用FFmpeg为Windows平台编写一个应用程序,它是golang包装器goav,但是我在理解如何使用C指针获取对数组的访问方面遇到了麻烦。 我试图获取存储在AVFormatContext类中的流以供使用,并最终将帧添加到OpenGl中的纹理以使视频播放器具有出色的过渡效果。 我认为了解如何转换和访问C数据将使编码变得容易得多。 我已经删除了C代码的所有相关部分,包装程序和我