【问题标题】:Why is the *ptr in printf?为什么 *ptr 在 printf 中?
【发布时间】:2018-10-24 11:07:42
【问题描述】:

在下面的代码中,(*ptr)[1] 不应该是(ptr)[1] 吗?因为ptr 也是一个指针,因为aa[][] 中。

int a[][3] = {1, 2, 3, 4, 5, 6};
int (*ptr)[3] = a;
printf("%d", (*ptr)[1]);

【问题讨论】:

  • int a[][3] 不是标准 C。您使用的是什么编译器?
  • @chux -- 我觉得还可以;就像在int x[] = { 1, 2, 3 }; 中一样,编译器从初始化器中推断出未指定的维度。 int a[][3] 或多或少是一回事。冗长的版本如下所示:typedef int x[3]; x a[] = { 1, 2, 3, 4, 5, 6 };。我并不是说这是一件好事,只是说这是合法的。
  • @pete 很公平 - 我确实收到警告“警告:初始化器 [-Wmissing-braces] 周围缺少大括号”。 your suggestion 也一样。期待像int a[][3] = {{1, 2, 3}};
  • @chux -- 是的;规则说您不需要花括号,但是将它们排除在外会使理解初始化程序的含义变得更加困难。此示例的全支撑初始值设定项是{ { 1, 2, 3 }, { 4, 5, 6 } },因为a 的每个元素都是一个由3 个整数组成的数组。这更清楚地表明其中有 2 个元素。

标签: c++ c arrays pointers


【解决方案1】:

没有。

  • a 是一个数组数组。

  • ptr 是指向该数组数组[第一个元素]的指针。

  • *ptr 是该数组的第一个元素(它本身就是一个数组!)。

    • 这也可以写成ptr[0](因为*(a+n)就是a[n])。
  • (*ptr)[1] 是该结果中的第一个元素。

    • 这个也可以写成ptr[0][1]

    • 写成a[0][1]会更清楚。

您提出的 ptr[1] 的反例是结果中的 next 元素,仍然是一个数组。

那个声明也很狡猾;初始化程序在技术上是有效的,但并没有按照您的想法执行,因为它只是似乎列出了一个维度。

总的来说,这不是很好的代码。

【讨论】:

  • "ptr 是指向该数组数组的指针。"没有。ptr 是一个指向数组的指针
  • @newacct 对,我就是这么说的。
  • 您说“ptr 是指向该数组数组的指针”,听起来ptr 是指向数组数组的指针,这不是正确的类型。 ptr 是指向ints 数组的指针。
  • @newacct ptr 是一个指向一个或多个ints 数组的指针,就像int* 是一个指向一个或多个ints 的指针一样。诚然,由于指针的怪异,这只是旋转它的一种方式。你说的是类型的字面解释,而我说的是语义。我会说两者都没有错。
  • ptr 只指向int 的一个数组。如果您知道该数组是数组数组的元素,那么您可以使用指针算法来获取指向下一个元素(或前一个元素,如果它不是第一个元素)的指针。但这并没有改变ptr 仍然只指向一个int 数组的事实。它指向的东西可能是也可能不是数组的元素,它不知道这一点。使用马虎的语言会使学习者感到困惑; int * 不是“指向ints 数组的指针”,因为也就是说,int (*)[42]
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 2023-04-10
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多