【问题标题】:why changing pointer to array name changes result? [duplicate]为什么更改指向数组名称的指针会更改结果? [复制]
【发布时间】:2020-05-23 20:16:19
【问题描述】:

在下面的代码中,如果我将 int (*p)[R][C]; 更改为 int p[R][C]; 结果从 800 更改为 80。为什么会发生这种情况,正如我在 int p[R][C]; 中理解的那样,数组名称 p 也是像 *p in@ 这样的指针987654326@

#include <stdio.h>

#define R 10
#define C 20

int main()
{
   int (*p)[R][C];
   printf("%d",  sizeof(*p));
   getchar();
   return 0;
}

PS:- 是*p inint (*p)[R][C]; 充当指向另一个实际上指向数组的指针的指针吗?

【问题讨论】:

  • 第一个创建指针数组而不是整数数组。
  • @johnelemans 第一个是指向多维整数数组而不是指针数组的指针!
  • printf("%d", sizeof(*p)); 是错误的。 sizeof() 返回size_tsize_t 的正确格式说明符是%zu

标签: c pointers multidimensional-array sizeof implicit-conversion


【解决方案1】:

这个

int (*p)[R][C];

声明一个指向类型为int[R][C] 的数组的指针。表达式sizeof( int[R][C] ) 的结果等于R * C * sizeof( int )

表达式*p 的类型为int[R][C]。所以sizeof( *p ) 等价于sizeof( int[R][C])。

至于这份声明

int p[R][C];

然后表达式 *p 中的数组指示符 p 被转换为指向其第一个元素的指针,并取消引用该指针,您将获得类型为 int[C] 的数组的第一个元素。

所以对于变量p 作为指针sizeof( *o ) 的第一个声明等于sizeof( int[R][C]

对于变量p作为二维数组的第二次声明sizeof( *p )等于sizeof( int[C] )

使用 p 的第一个声明作为指针,如果你写的话,你可以获得与声明为数组的 p 相同的结果

sizeof( **p )

这是在你第一次获得一个类型的对象时解引用指针,该对象在第二个声明中用于将变量 p 声明为数组。

注意这个调用

printf("%d",  sizeof(*p));

具有未定义的行为,因为使用了错误的转换格式。你必须写

printf("%zu",  sizeof(*p));

【讨论】:

  • 这是否意味着int (*p)[R][C]; 中的*p 充当指向另一个实际指向数组的指针的指针?
  • @gisire 是指向数组类型 int[R][C] 的对象的指针。
  • @gisire This int (*p)[R][C];是一个指针的声明。表达式中使用的记录 *p 产生指向对象,该对象是 int[R][C] 类型的对象。就像你有一个像 int *p; 这样的声明一样。然后表达式 *p 产生一个 int 类型的对象。
  • @Kaz 不,问题不在于这个。它与 sizeof 运算符和取消引用运算符有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2020-02-01
  • 2017-12-09
  • 2020-03-12
相关资源
最近更新 更多