指针间接混淆

时间:2010-09-02 15:05:39

标签: c

我有一个数组:

int x[3][5]={
        {1,2,3,4,5},
        {6,7,8,9,10},
        {11,12,13,14,15}
        };
  1. * x指的是什么?
  2. *(* x + 2)+5指的是“8”。这是怎么发生的?
  3. *(* x + 2)是否与*(* x)+2?
  4. 相同
  5. 如果我这样做:

    * N =&安培; X; 指针n指向哪里?如果它只是x而不是&那它本来就是基地址。现在怎么办?

5 个答案:

答案 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)

  1. *x是一个取消引用操作。换句话说,“给我x所指的是什么”。由于这是一个数组(数组),解引用x将为您提供第一个数组。这相当于x[0]的数组访问语法。

  2. *(*x+2)+5相当于x[0][2] + 5,它为您提供8.这是因为: *xx[0]相同(请参阅#1),*(x + 2)x[2]相同。一旦你完成了两次解引用,就会从数组(类似于双指针)到数组(单指针)到实际数字(第一个数组中的第三个项目)。然后,它只是3 + 5 = 8。

  3. *(*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与'& x [0] so * x is the same as x [0]`相同,后者是第一个5元素数组。

  • *(* x + 2)+5指“8”。这是怎么发生的?

*x为x [0],x+2&x[2],因此*x+2&x[0][2]*(*x + 2)x[0][2]恰好是3.为8添加五个。

  • *(* x + 2)是否与*(* x)+2相同?
正如我们所见,

*(*x+2)x[0][2]*(*x)为x [0] [0],因此*(*x)+2x[0][0]+2。所以*(*x+2)*(*x)+2最终都等于3,但这只是巧合。

答案 4 :(得分:0)

所有答案都是100%正确,我将以一般术语概括地解释*n=&x这一部分

&x生成一个指针(包含另一个变量地址的变量)并将其存储在n中,并获取n指向的值,您*n称为de引用或间接寻址

要真正了解这种指针业务,您需要研究计算机如何在内存中存储值。