循环通过未知大小的C++数组

Mik*_*e B 2 c++ arrays for-loop

我试图遍历一个double未知大小的数组.

为什么以下不起作用?

for (unsigned int = 1; i < sizeof(anArray)/sizeof(double); i++) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

一切都编译好(g++ -Wall -Werror -std=c++11 app.cpp -o app),但程序甚至没有进入循环.

功能齐全:

struct stock_data {
   int sell_index;
   int buy_index;
   double profit;
};

stock_data max_profit(double price_array[]) {
   int sell_index = -1, buy_index = -1, 
      min = 0;

   double profit = 0.0;

   for(int i = 1; i < size; i++) {

      if(price_array[i] - price_array[min] > profit) {
         sell_index = min;
         buy_index = i;
         profit = price_array[i] - price_array[min];
      }

      if(price_array[i] < price_array[min]) {
        min = i;
      }
   }  

   return {sell_index, buy_index, profit};
}

int main() {
   double yesterday[] = {0.1, 0.2, 0.3, 0.4};
   stock_data data = max_profit(yesterday);
   cout << data.profit << endl;
}
Run Code Online (Sandbox Code Playgroud)

usr*_*567 6

sizeof(anArray)anArray可能返回类型的大小*double。您必须将数组大小作为附加参数传递或使用std::vector它的size方法。

看一下 C 主函数,main(argc, argv)其中argv是程序的参数及其argc计数。或者采用字符串,它们的结尾由决定其结尾的特殊字符 \0 确定。但这很容易出错。

在 C/C++ 中,没有其他方法可以处理数组。


Vla*_*cow 6

在C++中,运算符sizeof是一个编译时运算符.也就是说,它的值是由编译器在运行时计算的.

因此,如果您说数组的大小未知,则编译器无法计算数组占用的内存大小.

所以很明显,anArray是指向你可能传递给函数的数组的第一个元素的指针.

这样表达

sizeof(anArray)/sizeof(double)
Run Code Online (Sandbox Code Playgroud)

等同于表达

sizeof( double * )/sizeof( double ).
Run Code Online (Sandbox Code Playgroud)

您还必须将数组的大小显式传递给函数.

考虑到通过值传递给函数的数组将转换为指向其第一个元素的指针.

或者另一种方法是使用conteiner std::vector<double>而不是数组.

你可以声明你的功能

stock_data max_profit(double price_array[], size_t size );
Run Code Online (Sandbox Code Playgroud)

并称之为

 stock_data data = max_profit( yesterday, 
                               sizeof( yesterday ) / sizeof( *yesterday ) );
Run Code Online (Sandbox Code Playgroud)

  • 或者使用 `std::array` 或 `std::vector` (2认同)