什么是" int (**p)[2]; "?



问题是:

#include <stdio.h>
int main()
{
int a[2][2] = { {6, 2}, {3, 4} };

int (**p)[2];
p = a;

for (int i = 0; i < 4; i++) {
printf("%pn", (*p + i));
printf("%dn", *(*p + i));
}
return 0;
}

我将int(**p)[2];解释为指向大小为2的1D数组的双指针。

我得出这个结论是因为:

  1. int *p[2];表示大小为2的整型指针数组。
  2. int (*p)[2];表示指向大小为2的1D数组的整型指针。

,

  1. int **p[2];表示大小为2的整型双指针数组。
  2. int (**p)[2];表示指向大小为2的1D数组的整型双指针。

1、2、3、4个陈述中哪些是正确的,哪些需要更正?

因此,这段代码的输出是什么?

我试过了。

你的'断言'(1,2,3和4)基本上都是正确的。然而,我会使用不同的、更特定的术语,特别是避免使用"双指针"这个术语。(这可能——而且经常——被误解和/或误用。)

:

  1. int *p[2];声明p为两个指向整数指针的数组;
  2. int (*p)[2];声明p为指向两个整数数组的指针;
  3. int **p[2];声明p为包含两个元素的数组,每个元素都是指向指向整型指针的指针;
  4. int (**p)[2];声明p为指向两个整数数组的指针。

…这段代码的输出是什么?

由于p = a;行,代码格式错误。此外,printf("%dn", *(*p + i));行表现出未定义的行为,因为格式说明符(%d,它期望一个int参数)和提供的参数(*(*p + i),它的类型是int*)之间存在不匹配。


你的代码没有显示未定义行为的版本,可能可能做你正在寻找的是以下(阅读注释):

#include <stdio.h>
int main()
{
int a[2][2] = { {6, 2}, {3, 4} };
int(**p)[2];
int(*t)[2] = &a[0]; // a pointer to an array of 2 integers (1st half of "a")
//  int(*t)[2] = a;     // Works the same as "a" decays to address of 1st element
p = &t;             // "p" is now (correctly) a pointer to that pointer
for (int i = 0; i < 2; i++) { // Going beyond 2 elements is UB (but MAY work)
printf("%pn", (void*)(*p + i)); // Arguments for "%p" should be void*
printf("%dn",  (**p)[i]); // Dereference "p" twice then get array element
}
return 0;
}

因此,这段代码的输出是什么?

定义

当你访问不属于任何对象的元素时

我解释int(**p)[2];作为指向大小为1D数组的双指针2 .

指向2元素int数组的指针。

双指针不是一个很难懂的价格术语。

程序错误。编译器应该为这个赋值发出一条消息

p=a;

使用不兼容的指针类型。

数组声明为

int a[2][2] = {{6, 2}, {3, 4}};

在上面的表达式语句中,隐式地转换为int ( * )[2]类型的指针。因此,右侧操作数的类型为int ( * )[2],而左侧操作数的类型为int ( ** )[2]

在printf

调用中
printf("%pn", (*p + i));
printf("%dn", *(*p + i));

表达式*p的类型为int ( * )[2],表达式*( *p + i )的类型为int[2]。所以在任何情况下,这些调用都没有意义。

你可以写

#include <stdio.h>
int main()
{
int a[2][2] = { { 6, 2 }, { 3, 4 } };

int ( *p )[2];
p = a;
for ( int i = 0; i < 2; i++ ) 
{
printf( "%pn", ( void * )( p + i ) );
for ( int j = 0; j < 2; j++ )
{
printf( "%dn", *( *(p + i) + j ));
}
}
return 0;
}

程序输出可能像

0x7ffc550ffc50
6
2
0x7ffc550ffc58
3
4

或者你可以写

#include <stdio.h>
int main()
{
int a[2][2] = { { 6, 2 }, { 3, 4 } };

int ( *p )[2];
p = a;
for ( int i = 0; i < 4; i++ )
{
printf( "%pn", ( void * )( *p + i ) );
printf( "%dn", *( *p + i ) );
}    
return 0;
}

程序输出可能看起来像

0x7ffc550ffc50
6
0x7ffc550ffc54
2
0x7ffc550ffc58
3
0x7ffc550ffc5c
4

相关内容

  • 没有找到相关文章

最新更新