int s[4][2]= {
{1234,56},
{1212,33},
{1434,80},
{1312,78}
};
int i,j;
for(i=0;i<=3;i++)
{
printf("\n");
for(j=0;j<=1;j++)
{
printf("%d ",*(s[i]+j));
}
}
输出显示是
1234,56 1212,33 1434,80 1312,78
我们知道*(&Variable)
将打印变量的值但是当我们在上面的程序中实现相同的概念时......
int s[4][2]= {
{1234,56},
{1212,33},
{1434,80},
{1312,78}
};
int i,j;
for(i=0;i<=3;i++)
{
printf("\n");
for(j=0;j<=1;j++)
{
printf("%d ",*(&s[i]+j));
}
}
输出显示数组中每个元素的地址。
为什么会这样? 为什么Output不等于Array ??
的元素值答案 0 :(得分:2)
请注意,s
是一个二维数组,在某些情况下,数组名会衰减到指向第一个元素的指针。
这里,s[i]
是数组类型,两个int
的数组。
然后,引用C11
,章节§6.3.2.1,
除非它是
sizeof
运算符,_Alignof
运算符或者&
运算符的操作数。 一元*(s[i]+j)
运算符,或者是用于初始化数组的字符串文字,一个包含的表达式 type ''类型''的数组被转换为类型''指向类型''指针的表达式 到数组对象的初始元素,而不是左值。 [...]
因此,
在第一种情况下,
s[i]
int [2]
属于int *
类型,它衰减为int *
,用于指针算术,生成另一个int
。取消引用后,您会收到*(&s[i]+j)
。
在第二种情况下,
&s[i]
由于上述相同的原因,如果是s[i]
,int [2]
不会衰减,而且类型是“指向int [2]
的指针”指针算法就可以了。因此,在这种情况下,添加的结果也是“指向int *
的指针”,在最终的取消引用之后,它变为%d
,这是FATAL ERROR - The following SQL query failed: ALTER TABLE "api_poi" ADD CONSTRAINT "user_id_refs_id_20f256ff" FOREIGN KEY ("user_id") REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED;
The error was: insert or update on table "api_poi" violates foreign key constraint "user_id_refs_id_20f256ff"
DETAIL: Key (user_id)=(1) is not present in table "auth_user".
的不匹配,这就是由您的编译器报告。
答案 1 :(得分:0)
你的阵列是二维的。因此,s[i]
是行i
的地址(即s[i]
的类型为int *
),&s[i]
是地址的地址(即类型int **
)。当您对其应用*
时,您会获得一个地址(即int *
)。
运营商&
的确意味着&#34;地址&#34; *(&x)
是指x
的值。
答案 2 :(得分:0)
第一个案例
您的打印声明就是这样。
printf("%d ",*(s[i]+j));
这里s [i] + j是地址。
让我们考虑i = 0,j = 1,第一个i循环,第二个j循环。
这里s [i]将是值1234所在的地址。让我们说它是489000。 所以s [i] + j,这里s [0] +1将是值56所在的地址。让我们说它是489004
所以,*(s [i] + j),即;这里*(s [0] +1)将给出地址489004处的值,即56。 所以这里将打印值1234,56,1212等。
第二个案例 你的打印声明是这样的。
printf("%d ",*(&s[i]+j));
这里&amp; s [i] + j是地址。
让我们考虑i = 0,j = 0,第一个i循环,第一个j循环。
这里s [i]将是值1234所在的地址。 可以说它是489000。 因此&amp; s [i]将是489000地址所在的地址。 可以说它是380000。 回想一下指针的概念。
所以&amp; s [i] + j将是“地址489000所居住的地址+ j”。 即; 380000 + J
我们在operator *上对我们得到的这个特定“地址”应用了一个值。 *(&安培; S [I] + j)的。 它变成了, 值为['地址489000所在的地址'+ j]。 值为[380000 + j]。
当i = 0,j = 0时,它将打印,值为[380000],即; 489000。
因此它将打印存储值1234,56,1212等的地址。