c - 为什么更改指向数组名称的指针会改变结果?

标签 c pointers multidimensional-array sizeof implicit-conversion

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

#include <stdio.h>

#define R 10
#define C 20

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

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

最佳答案

这个

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));

关于c - 为什么更改指向数组名称的指针会改变结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60117759/

相关文章:

c - 多个 char* 比较的段错误

c - 使用 sprintf 动态设置精度

c - gnu内联汇编错误

c - 警告 : format '%lu' expects argument of type 'long unsigned int' , 但参数 4 的类型为 'long unsigned int *' [-Wformat]

c++ - 我应该将 Vector<> 声明为 Vector<>* 吗?

java - 如何从多行字符串中获取二维数组?

mysql - 遍历 Nodejs MySQL 结果集中的字段

c - 在 C 中重新定义寄存器位域的技巧

c++ - 如何解释这个奇怪的输出?关于指针和临时变量

c++ - 使用多维 std::initializer_list