[英]what does int (**p)[2] declare ? And what would be stored in array **p?
什么将存储在数组**p
中?
int main()
{
int i, a[2][2]={{1,2},{3,4}};
int (**p)[2];
p=a;
for(i=0;i<4;i++)
printf("%d ", *(*p+i));
return 0;
}
int (**p)[2]
声明了什么?
p 作为指向 int 数组 2 的指针的指针
(非常有用的网站C 乱码 ↔ 英文)
什么将存储在数组
**p
中?
在**p
数组 2 int
。
p
是一个指针。 p
还将存储一个指针。 p
中存储的指针指向int
的数组 2。
int array2[2] = {5, 7};
int (*pointer)[2] = &array2;
int (**p)[2] = &pointer;
printf("%d %d\n", (**p)[0], (**p)[1]); // output "5 7\n"
我认为这个声明中有一个错字。
int (**p)[2];
必须有
int (*p)[2];
也就是说,它是一个指向int[2]
类型数组的指针的声明
在这个任务中
p = a;
数组 a 被隐式转换为指向其第一个类型为int[2]
的元素的指针。 也就是说,在此赋值中,右侧操作数的类型为int ( * )[2]
,左侧操作数的类型相同。
否则你会得到一个编译数组,因为指针int ( ** )[2]
和int ( * )[2]
不兼容,
在这个 for 循环中
for(i=0;i<4;i++)
printf("%d ", *(*p+i));
事实上,对int *
类型的指针进行了重新解释。 由于指针p
具有int ( * )[2]
类型,然后将其解引用,您将获得int[2]
类型的左值,但在表达式*p+i
中使用该数组依次转换为指向其第一个元素的指针。 那是在表达式*p+i
中,您有指向元素a[0][0]
指针。
你可以重写表达式
*(*p+i)
喜欢
( *p )[i]
如果使用 int( ** )[2] 类型的指针,那么 function main 的主体可能看起来像
int i, a[2][2]={{1,2},{3,4}};
int (*q)[2] = a;
int ( **p )[2] = &q;
for(i=0;i<4;i++)
printf("%d ", *( **p +i ) );
那是添加了访问数组元素的另一种间接方式。
提问者的代码无法编译:
int i, a[2][2]={{1,2},{3,4}};
int (**p)[2];
p=a;
错误 C2440:“=”:无法从“int [2][2]”转换为“int (**)[2]”
如果打算定义一个指向 2x2 数组a的指针,则p应定义为指向 int 数组 2 的数组 2 的指针,并因此使用:
int main()
{
int a[2][2] = { {1,2},{3,4} };
int(*p)[2][2];
p = &a;
printf("{%d, %d} \n", (*p)[0][0], (*p)[0][1]);
printf("{%d, %d} \n", (*p)[1][0], (*p)[1][1]);
return 0;
}
output 是:
{1, 2}
{3, 4}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.