2010-09-02 85 views
1

我有一个数组为:指针间接混乱

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. 如果我这样做:

    * n =&x; 指针n指向哪里?如果它只有x而不是&那么它就是基地址。现在是什么?

+5

看起来很像功课。你可以请至少尝试自己先回答吗? – x4u 2010-09-02 15:11:04

+0

我可以很容易地通过运行该程序来做到这一点。我需要一个亲爱的解释。 – 2010-09-02 15:13:26

回答

4
  1. *x是取消引用操作。换句话说,“给我什么x指向”。由于这是一个数组(数组),所以dereferencing x会给你第一个数组。这相当于x[0]的数组访问语法。

  2. *(*x+2)+5相当于x[0][2] + 5,它给你8.这是因为: *x相同x[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。同样的答案,但获得它的方式非常不同。

+0

你是说如果我有*(* x + 1),我会先找到它指向的地方?即x [0] [0],然后加1到它指向的值?不会和*(* x)+1相同吗? – 2010-09-02 15:30:07

+1

@fahad *(* x + 1)将是x [0] [1],它是第一个数组中的第二个元素。 *(* x)+1表示取x [0] [0]并将1加1。再次,在你的具体情况下,它们都等于2。 – Bob 2010-09-02 15:40:54

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

'* x'不是一个指针,它是一个数组。在某些情况下,它可能衰减到指针,但并不总是如此。例如,尝试'sizeof * x'。 – 2010-09-02 15:33:30

+0

好点,我会改变措辞。 – WildCrustacean 2010-09-02 15:34:30

1

x是一个int**所以它就像是如果你有第一层指针,并且他们每个人都指向一个int*(所以一个int的数组)。

当您编写*x时,您将获得包含指向多维数组第一行的地址的地址。

所以,如果你参考(*x + 2),如果它像引用你的第一行数组,然后加2到地址:你获得第一行的第三个元素的地址。但是由于这仍然是一个指针,所以您需要添加一个外部的*(*x+2)来精确地获取第一行的第三个元素。

+0

'x'不是'int **'。 'x'永远不会衰变为'int **'。 – 2010-09-02 15:32:43

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,但这仅仅是一个巧合。