【问题标题】:What is the difference between std::string (*)[96][60] and std::string* [96][60]?std::string (*)[96][60] 和 std::string* [96][60] 有什么区别?
【发布时间】:2015-06-28 22:44:49
【问题描述】:

我有多个二维 96×60 std::string 数组。我正在尝试创建一个可以指向这些数组之一的指针。

数组看起来像这样:

std::string array1[96][60];
std::string array2[96][60];

我做的指针是这样的:

std::string *ptr_to_array[96][60];

如果我只声明指针,一切都会编译。但是当我尝试执行以下操作时

ptr_to_array = &array1;

我得到这个错误:

error: incompatible types in assignment of ‘std::string (*)[96][60]’ to ‘std::string* [96][60]’

对我来说,这两种类型似乎是相同的。

另外,从我读到的关于这个主题的内容来看,很多人建议使用std::array。我会,但是在尝试处理多维std::arrays 时,这似乎是一个比这更大的问题。我宁愿只修复我的 std::string 数组,但切换到 std::array 会更好或更容易吗?

【问题讨论】:

  • std::string (*)[96][60] 是一个指向字符串数组的指针。 std::string* [96][60] 是一个指向字符串的指针数组。让它std::string (*ptr_to_array)[96][60];
  • @IgorTandetnik 那么我应该怎么写ptr_to_array = &array1;这行呢?我想我必须以某种方式更改&array1
  • 不,你必须以某种方式更改ptr_to_array
  • @MSalters 为什么要引入以前没有的堆分配?
  • 如果你有一个 C++11 编译器,你可以简单地使用 auto ptr_to_array = &array1; 而不必弄乱指向数组语法的指针。

标签: c++ arrays pointers multidimensional-array


【解决方案1】:

类型相同。 std::string* [96][60] 是一个二维指针数组。 std::string (*)[96][60] 是一个指向二维数组的指针。

  • 从字面上看,你需要一些类似的东西

    std::string (*ptr_to_array)[96][60];
    ptr_to_array = &array1;
    

    以后就可以通过指针访问数组了

    (*ptr_to_array)[i][j];
    

    在这种情况下,您实际上将ptr_to_array 声明为指向二维数组的指针。

  • 或者,你可以这样做

    std::string (*ptr_to_array)[60];
    ptr_to_array = array1;
    

    以后访问它

    ptr_to_array[i][j];
    

在初始化指针时,前一个变体将强制两个数组大小完全匹配。后一种变体忽略了第一个数组大小。

  • 您还可以在第一个变体中使用对数组的引用

    std::string (&ref_to_array)[96][60] = array1;
    

    这将保留“自然”的数组访问语法

    ref_to_array[i][j];
    

    但引用必须在声明时初始化。

【讨论】:

    【解决方案2】:

    这个

    std::string *ptr_to_array[96][60];
    

    不是指针的声明。它是指向std::string 类型对象的指针的二维数组的声明。

    如果要使用表达式

    &array1
    

    并将其分配给指针,然后必须像这样定义指针

    std::string ( *ptr_to_array )[96][60];
    ptr_to_array  = &array1;
    

    但我怀疑实际上您需要一个指向数组第一个元素的指针。在这种情况下,声明看起来像

    std::string ( *ptr_to_array )[60];
    ptr_to_array  = array1;
    

    【讨论】:

      【解决方案3】:

      如果我理解你的问题是正确的,这就是你要找的对吗?

      std::string array1[3][3];
      std::string array2[3][3];
      auto* test = &array1;
      
      std::cout << test[0] << std::endl;
      
      test = &array2;
      
      std::cout << test[0] << std::endl;
      

      【讨论】:

      • 也许吧。恐怕&amp;array1 是一个指向字符串的二维指针数组,这不是我想要的。我想要一个指向二维字符串数组的指针。我不完全确定其中一个 &amp;array1 评估为。
      • @juanchopanza 我会尝试一下,让你们知道。但是我应该像这个人说的那样使用auto* ptr,还是应该像上面的人说的那样使用auto ptr
      • @gragas auto ptr 应该没问题。
      【解决方案4】:

      我猜你想要一个可以像原始数组一样索引的指针:

      #include <string>
      #include <iostream>
      using namespace std;
      
      auto main() -> int
      {
          string array1[96][60] = {{"Alpha", "Bravo", "Charlie"}};
          string array2[96][60];
      
          string (*p)[60] = array1;
      
          cout << array1[0][2] << endl;
          cout << p[0][2] << endl;
      }
      

      您可以使用typedef 或C++11 using 来定义类型的名称,而不是像上面那样直接与C 语法作斗争,这样会更清楚:

      #include <string>
      #include <iostream>
      using namespace std;
      
      auto main() -> int
      {
          using String_row    = string[60];
          using String_matrix = String_row[96];
      
          String_matrix array1 = {{"Alpha", "Bravo", "Charlie"}};
          String_matrix array2;
      
          String_row* p = array1;
      
          String_matrix* pa = &array1;
      
          cout << array1[0][2] << endl;
          cout << p[0][2] << endl;
          cout << (*pa)[0][2] << endl;
      }
      

      如果你真的想要一个指向数组本身的指针,而不是一个指向数组第一项的很好的可索引指针,那么在 C 语法级别它会像

      string (*pa)[96][60] = &array1;
      

      你会像这样使用它

      cout << (*pa)[0][2] << endl;
      

      它与指向第一项的指针相同的内存地址,但类型略有不同。


      综上所述,我建议定义或使用基于std::vector 的矩阵类作为存储提供程序,而不是直接使用原始数组。

      【讨论】:

        猜你喜欢
        • 2016-06-25
        • 1970-01-01
        • 2021-03-23
        • 2023-01-22
        • 2011-11-04
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多