我有一个数组:
int x[3][5]={
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
如果我这样做:
* N =&安培; X; 指针n指向哪里?如果它只是x而不是&那它本来就是基地址。现在怎么办?
答案 0 :(得分:6)
*x
指的是第一个数组({1,2,3,4,5}),相当于x [0]。向x
添加一个移动到下一个数组,因此*(x+1)
将引用第二个数组,并且相当于x [1]。
*(*x + 2)
是第一个数组中的第三个元素,即3.这意味着*(*x + 2) + 5
等于8。
括号很重要,例如*(*(x+2))
将是第三个数组中的第一个元素。
*(*x + 2)
会产生与*(*x) + 2
相同的值,但不会使用相同的数组元素。
答案 1 :(得分:5)
*x
是一个取消引用操作。换句话说,“给我x
所指的是什么”。由于这是一个数组(数组),解引用x将为您提供第一个数组。这相当于x[0]
的数组访问语法。
*(*x+2)+5
相当于x[0][2] + 5
,它为您提供8.这是因为:
*x
与x[0]
相同(请参阅#1),*(x + 2)
与x[2]
相同。一旦你完成了两次解引用,就会从数组(类似于双指针)到数组(单指针)到实际数字(第一个数组中的第三个项目)。然后,它只是3 + 5 = 8。
*(*x+2)
相当于x[0][2]
(参见#2),即3(数组中的第三个元素)。但是,*(*x) + 2
会为您提供x[0][0] + 2
(数组中的第一个元素加2),即1 + 2 = 3.答案相同,但获取方式却截然不同。
答案 2 :(得分:1)
x是int**
所以就像你有第一层指针一样,每个指针都指向一个int*
(所以int
数组)。
当您编写*x
时,您将获得包含指向多维数组第一行的地址的地址。
因此,如果你引用(*x + 2)
,如果它像引用你的数组的第一行,然后将2加到地址:你获得第一行第三个元素的地址。但由于这仍然是一个指针,因此您需要添加一个外部*(*x+2)
来准确获取第一行的第三个元素。
答案 3 :(得分:1)
这样想:
typedef int Int5[5];
Int5 x[3];
x
是一个包含3个元素的数组。这三个元素中的每一个都是5个整数的数组。
x
与'& x [0] so
* x is the same as
x [0]`相同,后者是第一个5元素数组。
*x
为x [0],x+2
为&x[2]
,因此*x+2
为&x[0][2]
,*(*x + 2)
为x[0][2]
恰好是3.为8添加五个。
*(*x+2)
是x[0][2]
。 *(*x)
为x [0] [0],因此*(*x)+2
为x[0][0]+2
。所以*(*x+2)
和*(*x)+2
最终都等于3,但这只是巧合。
答案 4 :(得分:0)
所有答案都是100%正确,我将以一般术语概括地解释*n=&x
这一部分
&x
生成一个指针(包含另一个变量地址的变量)并将其存储在n
中,并获取n指向的值,您*n
称为de引用或间接寻址
要真正了解这种指针业务,您需要研究计算机如何在内存中存储值。