我有一个数组为:指针间接混乱
int x[3][5]={
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
- 是什么* X是指什么?
- *(* x + 2)+5参考“8”。这是怎么发生的?
- 是*(* x + 2)与*(* x)+2相同吗?
如果我这样做:
* n =&x; 指针n指向哪里?如果它只有x而不是&那么它就是基地址。现在是什么?
我有一个数组为:指针间接混乱
int x[3][5]={
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
如果我这样做:
* n =&x; 指针n指向哪里?如果它只有x而不是&那么它就是基地址。现在是什么?
*x
是取消引用操作。换句话说,“给我什么x
指向”。由于这是一个数组(数组),所以dereferencing 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。同样的答案,但获得它的方式非常不同。
你是说如果我有*(* x + 1),我会先找到它指向的地方?即x [0] [0],然后加1到它指向的值?不会和*(* x)+1相同吗? – 2010-09-02 15:30:07
@fahad *(* x + 1)将是x [0] [1],它是第一个数组中的第二个元素。 *(* x)+1表示取x [0] [0]并将1加1。再次,在你的具体情况下,它们都等于2。 – Bob 2010-09-02 15:40:54
*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
的值相同,但不使用数组中的相同元素。
'* x'不是一个指针,它是一个数组。在某些情况下,它可能衰减到指针,但并不总是如此。例如,尝试'sizeof * x'。 – 2010-09-02 15:33:30
好点,我会改变措辞。 – WildCrustacean 2010-09-02 15:34:30
x是一个int**
所以它就像是如果你有第一层指针,并且他们每个人都指向一个int*
(所以一个int
的数组)。
当您编写*x
时,您将获得包含指向多维数组第一行的地址的地址。
所以,如果你参考(*x + 2)
,如果它像引用你的第一行数组,然后加2到地址:你获得第一行的第三个元素的地址。但是由于这仍然是一个指针,所以您需要添加一个外部的*(*x+2)
来精确地获取第一行的第三个元素。
'x'不是'int **'。 'x'永远不会衰变为'int **'。 – 2010-09-02 15:32:43
认为它是这样的:
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,但这仅仅是一个巧合。
看起来很像功课。你可以请至少尝试自己先回答吗? – x4u 2010-09-02 15:11:04
我可以很容易地通过运行该程序来做到这一点。我需要一个亲爱的解释。 – 2010-09-02 15:13:26