【问题标题】:int (*p) [4]?整数 (*p) [4]?
【发布时间】:2010-08-01 17:11:45
【问题描述】:

int (*p) [4] ;

“p”是指向 4 个整数数组的指针吗?要不然是啥 ??

我怎样才能为这个指针调用“新”?

【问题讨论】:

  • 从下面的答案中可以看出。这种类型声明之王令人困惑且不直观,因此最好避免(除非您想添加过多的 cmets)。如果您使用其他构造,则可以以更易读的方式获得相同的结果(例如 std::vector 或 boost::array)
  • @Martin: std::vector<>int (*p)[4] 是完全不同的动物!
  • @Seth:但int (*p)[4] 可能更好地被二维std::vector<std::vector<int> > 或一维std::vector<int> 替换为手动索引算法或boost::multi_array<int, 2>
  • @Martin York,@FredOverflow:感谢您的回答,但我没有使用此数组在我的项目中存储数据。但是我们大学有一个医生非常喜欢这种问题:(,尽管它令人困惑:(

标签: c++


【解决方案1】:

“p”是指向 4 个整数数组的指针吗?

正确!

如何为这个指针调用“new”?

例如,p = new int[7][4]

【讨论】:

  • Err.. 在编辑之前为 +1。 new int[7][4] 为您提供 28 个整数宽的单个块。
  • humm .. 所以我认为 p 是指向 4 个整数指针的指针,每个指针都指向 4 个整数数组,对吗??
  • @Billy:我的例子没有错。 new int[7][4] 的类型 int (*)[4]。也许使用 typedef 更明显? typedef int row[4]; row *p = new row[7]; 这完全等同于我的代码,只是更具可读性。你会认为这也是错误的吗?
  • @Farah:不,它不是指向 4 个整数的指针,它实际上是指向 4 个整数的指针。请记住,指针可以指向数组的单个元素(就像 char* 可以指向 C 字符串的字符一样)。
  • @Billy:欢迎来到 C 声明符语法地狱 ;-) 我能找到的最佳参考是 5.3.4(§5 和 §6)。
【解决方案2】:

int (*p)[4] 实际上是一个指向四个ints 数组的指针。

您可以动态分配类型为“指向四个int 的数组的指针”的对象,如下所示。

int (**ptr)[4] = new (int (*)[4]);

注意,没有为任何ints 分配空间;只有指针本身。

您可以按如下方式分配一个由 4 个整数组成的数组:

int *ptr = new int[4];

你不能做的(没有显式转换)是将指向动态分配的 4 int 数组的指针分配给 int (*)[4] 类型的指针。每当您通过new 分配数组时,即使您使用typedef,新表达式的类型也是指向数组第一个元素的指针; new 表达式的类型中不保留数组的大小。

这是因为new[] 表达式可以分配在运行时选择数组大小的数组,因此并不总是可能(甚至不希望)将数组大小编码为新表达式的类型。

正如建议的那样,您可以动态分配一个包含 4 个 int 的数组的数组。第一个数组的大小从类型信息中丢失了,你得到的是一个指向四个int 数组的数组(大小为 1)的第一个元素的指针。

int (*p)[4] = new int[1][4];

即使它是一个只有 1 个的数组(4 个 int 的数组),您仍然需要使用 delete[] 来释放 p

delete[] p;

【讨论】:

  • 当然,一个人永远不应该是一个需要手动调用delete的职位。
  • 好吧,那么 int (*p)[4] = new int[4][4] ... 我可以调用 delete 吗?我尝试: for (int i=0;i
  • @Farah_online: 数组的大小无关紧要,你总是用delete[] p; 删除数组所以p = new int[1][4]; ... delete[] pp = new int [4][4]; ... delete[] p .对数组成员(delete[] p[i]delete p[i])调用 delete 无效。
  • +1 表示 数组的大小是在运行时选择的,因此并不总是可能(甚至不希望)将数组大小编码为新表达式的类型。.
  • 好吧.. 我同意 new[] 可以分配一个大小由运行时状态决定的数组,但是现在,9 年后,我们确实有可以很好地跟踪constexprs 的编译器,并且在new int[6]new int[x] 之间存在明显的编译时间与运行时间差异,其中x 是intnew int[x],其中x 是constexpr。恕我直言,第一个可以轻松返回(int(*)[6]) 类型和最后一个:(int(*)[x])...我只希望在某个时间点将其包含在标准中
【解决方案3】:

online CDECL evaluator 是解决此类问题的有用资源:


cdecl

C gibberish ↔ English

int (*p)[4];

    declare p as pointer to array 4 of int

【讨论】:

  • ...除了 int (*p)[4]; 没有声明 p,而是定义它。 (至少在 C++ 中,这个问题是关于的。正如 Johannes 曾经指出的那样,在某些领域,C 和 C++ 在定义和声明方面有所不同。)
  • @sbi:好的,但每个定义也是一个声明;)“C 声明符语法”是一个广为接受的术语。
  • @FredOverflow;在 C 和 C++ 中,每个定义也是一个语句。尽管如此,人们很少混淆“定义”和“声明”,而是一直混淆“定义”和“声明”。
  • @sbi:我很确定int foo() { return 42; } 的定义不是声明;)
  • @FredOverflow: <blush> 从头开始​​。那是什么?本地自动变量的定义不被视为语句吗?无论如何,我的观点是:人们一直在搞乱声明和定义。 (例如,stackoverflow.com/questions/1410563 的一半以上的答案要么具有误导性,要么完全错误,在 cmets 中人们不断提出愚蠢的反例(int i; 不是定义),我不得不在标准中添加一个引用解决关于什么是类定义与类声明的不断重复的讨论。)所以我想准确地说。
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2017-10-16
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多