问题是:
#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数组的双指针。
我得出这个结论是因为:
int *p[2];
表示大小为2的整型指针数组。int (*p)[2];
表示指向大小为2的1D数组的整型指针。
,
int **p[2];
表示大小为2的整型双指针数组。int (**p)[2];
表示指向大小为2的1D数组的整型双指针。
1、2、3、4个陈述中哪些是正确的,哪些需要更正?
因此,这段代码的输出是什么?
我试过了。
你的'断言'(1,2,3和4)基本上都是正确的。然而,我会使用不同的、更特定的术语,特别是避免使用"双指针"这个术语。(这可能——而且经常——被误解和/或误用。)
:
int *p[2];
声明p
为两个指向整数指针的数组;int (*p)[2];
声明p
为指向两个整数数组的指针;int **p[2];
声明p
为包含两个元素的数组,每个元素都是指向指向整型指针的指针;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