C++ 数组作为指针
显示的输出为-28-28-28-28。 a的地址是-28,它指向-28。这是什么?如果可能的话,请用图表解释一下C++ 数组作为指针,c++,c,C++,C,显示的输出为-28-28-28-28。 a的地址是-28,它指向-28。这是什么?如果可能的话,请用图表解释一下 格式说明符%d用于类型int。您给它一些其他类型,因此,程序的行为是未定义的。您可能希望尝试%p(尽管它可能会显示类似的结果,此时您需要开始了解指针是关于什么的)。欢迎来到数组指针衰减的深度。结果是: x的类型是一个3D数组,int()[2][2][2] 如果你获取它的地址,没有什么特别的事情发生,你会得到一个指向该数组的指针,即。e&x的类型为int(*)[2][2][2] 然而,
格式说明符
%d
用于类型int
。您给它一些其他类型,因此,程序的行为是未定义的。您可能希望尝试%p
(尽管它可能会显示类似的结果,此时您需要开始了解指针是关于什么的)。欢迎来到数组指针衰减的深度。结果是:
x
的类型是一个3D数组,int()[2][2][2]
&x
的类型为int(*)[2][2][2]
*x
中,x
首先衰减为int(*)[2][2]
类型的指针(3D数组的第一个元素是2D数组)。然后取消对该指针的引用以生成2D数组int()[2][2]
&x
和&x
产生相同的地址&**x
给出3D数组中第一行的地址(其类型为int(*)[2]
)&***x
是数组中第一个元素的地址(其类型为int*
)数组指针衰减机制允许C严格按照指针算法定义数组下标运算符。关键是,所涉及的三种数组类型都有不同的大小,这允许编译器推断正确的偏移量。即
sizeof(*x)
是4*sizeof(int)
(记住*x
的类型是int()[2][2]
),sizeof(**x)
是2*sizeof(int)
。因此,x[1][0]
和x[0][1]
解析为3D阵列中的两个不同线阵列。结果相同,但类型不同,如下所示。
您首先必须知道,“T型数组的n个元素”类型的表达式已衰减
转换为“T型指针”,但数组是&、sizeof运算符的操作数或字符串文字时除外
表情
int main()
{
int x[2][2][2]={1,2,3,4,5,6,7,8};
printf("%d%d%d%d",&x,&*x,&**x,&***x);
}
在上述情况下,您总是使用&
运算符,这意味着表达式不会退化为前面解释的“T型指针”。
请注意,所有的输出都是相同的,但它们的类型不同,并且输出将是数组的基址。下面是区别,如果你写
&a // type is int(*)[2][2][2]
&*a // type is int(*)[2][2]
&**a // type is int(*)[2]
&***a // type is int *
现在如果你这样做了
int (*p)[2][2][2] = &a; // note types are same as shown above
//print p here
p++;
printf("%p",p);
请注意p
的两个值之间的差异。然后您必须注意到p
跳过整个数组,即全部8个元素。
如果你这样做了
int (*p)[2][2][2] = &a; // note types are same as shown above
//print p here
p++;
printf("%p",p);
与
int (*q)[2][2] = &*a; // note types are same
之后你会
int(*q)[2][2] = &a[0];
然后打印q
,注意原始q
和更新的q
的值之间的差异。您会发现它现在指向内存中下一个位置4。
这就是区别。
另外,将问题中的
%d
更改为%p
。您应该展示对问题的最低理解。。请分享你的想法。你的代码在做什么?如果这是可以理解的,我们也许可以帮助!1.发布实际代码,而不是虚构的东西。2.将指针打印为指针。3.数组不是指针。就我所见,a
在问题代码中是未定义的。所以输出应该是您描述的(或者任何东西,除了编译器错误)。您希望实现什么?