【问题标题】:Using pointers in array在数组中使用指针
【发布时间】:2013-08-07 11:21:03
【问题描述】:

我正在尝试让这段代码正常工作:

 #include <iostream>

void reset_2D_dbl_array(double **p, int nrows, int ncols);

int main(){
    double big_matrix[10][10];
    reset_2D_dbl_array(big_matrix,10,10);
    std::cout << big_matrix[0][0];
    std::cin.ignore();
    return 0;
}
void reset_2D_dbl_array(double **p, int nrows, int ncols){
  int n = nrows * ncols;
  while(n-- > 0){
    **p++ = 0.0;
  }
} 

我不明白为什么它不起作用。

我从新书《C++ for the impatient》中拿了代码,但还是不行..

在更改不带索引和方括号的值时,我想在函数中使用两个“at”符号。

编辑: 请查看我的第二条评论以获取更多信息,谢谢:)

编辑2: 粘贴了错误的代码:)

【问题讨论】:

  • 程序员不能不耐烦。
  • 大声笑,这就是这本书的名字:P我不急:P

标签: c++ arrays pointers multidimensional-array


【解决方案1】:

因为双指针不会衰减为双数组。只需将双精度数组传递给您的函数:

void reset_double_array(double p[][10], int nrows, int ncols);

如需解释为什么会这样,请see this question and its answers

看到你已经标记了你的问题 C++,你真的应该使用 std::vector&lt;std::vector&lt;double&gt;&gt; 来表示你的矩阵,并为自己省去指针和原始数组的麻烦。

【讨论】:

  • 对于用户来说,“矩阵”或“双数组”也是一种抽象,内存或C语言中没有“双数组”这样的东西,内存中的所有内容都在1中维度。
  • @user2485710 在 C++ 中,问题被标记为的语言,内存是内存位置集群的群岛。
  • @R.MartinhoFernandes 你是什么意思?大量的记忆跳跃?二维记忆?
  • @user2485710 一组隔离的内存位置集群。 C++ 并不将内存视为“一个大数组”。
  • @R.MartinhoFernandes 我在哪里说...我也不认为 POD 数组是来自 C++ 世界的 C++ 数据结构,更像是为了与旧的兼容而保留的 C 数据结构语言。
【解决方案2】:

您需要将其作为double 数组传递

void reset_double_array(double p[][10], int nrows, int ncols){
   for(int i=0;i<nrows;i++)
     for(int j=0;j<ncols;j++)
        p[i][j]=1.0;
}

并修复:

std::cout << big_matrix[9][9]; //instead of std::cout << big_matrix[9];

【讨论】:

  • 这就是问题所在,在我正在学习的书中(新书,也教 c++ 11),他们没有使用任何方括号,只是像我一样使用“at”符号..跨度>
  • (不是按 Enter 的意思,哈哈)他们像普通变量一样传递它,然后像指针一样使用它。关于 cout,我忘记了我修复了,我给你错误的代码,抱歉,哈哈。 .
【解决方案3】:

std::cout

【讨论】:

    【解决方案4】:

    目前还不太清楚您要在这里做什么。看起来好像您正在尝试设置每行中的第一个双精度数。在这种情况下,以下应该起作用:

    void reset_double_array(double **p, int nrows, int ncols)
    {
        double* val = *p;
        while(nrows-- > 0)
        {
            *val = 1.0;
            val += ncols;
        }
    }
    

    【讨论】:

      【解决方案5】:

      您可以使用如下指针来做到这一点:

      void reset_2D_dbl_array(double *p, int nrows, int ncols) { …… }

      那么当你传递实际的二维数组时:

      reset_2D_dbl_array(&big_matrix[0][0],10,10);

      reset_2D_dbl_array(big_matrix[0],10,10);

      【讨论】:

        猜你喜欢
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        相关资源
        最近更新 更多