【问题标题】:getting size of array from pointer c++从指针 c++ 获取数组的大小
【发布时间】:2021-07-23 21:18:16
【问题描述】:

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

这里是函数头:

int largest(int *list, int highest_index)

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

我尝试了以下方法:

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

任何帮助将不胜感激!

【问题讨论】:

  • 参数是固定大小的数组,还是只是一个指针?如果是指针,则无法查出它所指向的数组的大小。
  • 它是一个指针,我被分配使用那个函数标题。所以显然我采取了错误的方法。我正在尝试编写一个返回数组中最大 int 的递归函数。就我个人而言,我没有看到这一点,我觉得 for 循环会做得更好......
  • 不会highest_index 告诉您列表中有多少个整数?顾名思义,整数的计数为highest_index + 1
  • 我相信你是绝对正确的,谢谢!

标签: c++ arrays


【解决方案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*”的大小 - 取决于 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)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        sizeof( list ) / sizeof( int )
        

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

        【讨论】:

          【解决方案5】:

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

          const int SIZE = 10;
          int list[SIZE];
          // or
          int* list = new int[SIZE];  // do not forget to delete[]
          

          【讨论】:

          • sizeof(list) / sizeof(*list) 将始终返回定义它的范围内的数组大小(只要它是一个 c 样式的常量大小数组)。
          猜你喜欢
          • 2010-09-18
          • 2018-02-15
          • 1970-01-01
          • 2014-04-20
          • 2018-09-08
          相关资源
          最近更新 更多