为什么更改指向数组名称的指针会更改结果? [重复]

问题描述 投票:0回答:1
在下面的代码中,如果我将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:-*p中的int (*p)[R][C];是否充当指向另一个实际指向数组的指针的指针?
c pointers multidimensional-array sizeof implicit-conversion
1个回答
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));

© www.soinside.com 2019 - 2024. All rights reserved.