我正在尝试使用指针声明3D数组并将值存储到3D数组中。但我可以使用scanf获取输入,但输出始终打印地址而不是数组的值。以下是我的代码。我在这里做错了什么?
#include <stdio.h>
void main()
{
int b[3][3][3];
int l1,l2,l3;
int *pa2[3][3];
pa2[3][3]=b;
for(l1=0;l1<3;l1++)
{
for(l2=0;l2<3;l2++)
{
for(l3=0;l3<3;l3++)
{
scanf("%d",(((pa2+l1)+l2)+l3));
}
}
}
for(l1=0;l1<3;l1++)
{
for(l2=0;l2<3;l2++)
{
for(l3=0;l3<3;l3++)
{
printf("%d\n",*(((pa2+l1)+l2)+l3));
}
}
}
}
答案 0 :(得分:1)
为什么要使用指针pa2
?使用
scanf("%d",&b[l1][l2][l3]);
和
printf("%d\n",b[l1][l2][l3]);
如果你坚持使用积分,你需要让指针算术正确。阵列存储器连续布局(比较How are multi-dimensional arrays formatted in memory?)。以下示例可以解决这个问题:
#include <stdio.h>
int main(int argc, char **argv) {
int a[3][4][5];
void *p = a;
int x = 0;
int i, j, k;
for(i = 0; i < 3; ++i) {
for(j = 0; j < 4; ++j) {
for(k = 0; k < 5; ++k) {
a[i][j][k] = x++;
}
}
}
const size_t s = sizeof(int);
for(i = 0; i < 3; ++i) {
for(j = 0; j < 4; ++j) {
for(k = 0; k < 5; ++k) {
printf("%d ", *(int*)(p + 20*i*s + 5*j*s + k*s));
}
printf("\n");
}
printf("\n");
}
return 0;
}
答案 1 :(得分:1)
在pa
行和scanf
行中使用指针printf
来访问数组是错误的。
你有
scanf("%d",(((pa2+l1)+l2)+l3));
(((pa2+l1)+l2)+l3)
评估的内容是什么?
只是(pa2+l1+l2+l3)
。我相信这不是你的意思。通过使用它,您有一个受未定义行为影响的程序。
您可以使用:
&(pa2[l1][l2][l3])
如果您坚持使用不太清晰的表格,则需要使用:
(*(*(pa2+l1) + l2) + l3)
对于printf
语句,您可以使用:
printf("%d\n", pa2[l1][l2][l3]);
或
printf("%d\n", *(*(*(pa2+l1)+l2)+l3));
<强>更新强>
pa2
的声明和设置它的行也是错误的。
而不是
int *pa2[3][3];
pa2[3][3]=b;
你需要:
int (*pa2)[3][3];
pa2=b;
或一个班轮:
int (*pa2)[3][3] = b;
答案 2 :(得分:0)
3D数组是一个数组数组的数组,因此在向指针添加偏移量后,您需要取消引用它并重新开始:
*(*(*(pa + l1) + l2) + l3)
这相当于:
pa[l1][l2][l3]
答案 3 :(得分:-2)
我不确定你真正想用这个程序完成什么,但我认为我看到了部分问题。
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:nameField
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:cell attribute:NSLayoutAttributeRight
multiplier:1.0 constant:0]
[namefield addConstraint:constraint];
在尝试向其添加值之前,您应该取消引用指针。
因此:
printf("%d\n",*(((pa2+l1)+l2)+l3));
否则,您正在执行指针运算,这可能是您在输出中看到十六进制地址的原因。