C 指针间接混淆
我有一个数组:C 指针间接混淆,c,C,我有一个数组: 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而不是an&那么它就是基址。现在呢 *x表示第一个数组({1,2,3,4,5}),它等价于x[0]。将一个添加到x将移动到下一个数组,这样
int x[3][5]={
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15}
};
*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
表示第一个数组({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是一个int**
,所以这就像你有一个第一层的指针,每个指针都指向一个int*
(也就是一个int
数组)
写入*x
时,将获得包含指向多维数组第一行的地址的地址
因此,如果您采用
(*x+2)
,就像引用数组的第一行,然后将2添加到地址:您将获得第一行的第三个元素的地址。但由于这仍然是一个指针,您添加了一个外部的*(*x+2)
,以精确地获得第一行的第三个元素。x是一个int**
,所以这就像您有一个第一层指针,并且每个指针都指向int*
(因此是一个int
数组)
写入*x
时,将获得包含指向多维数组第一行的地址的地址
因此,如果您采用(*x+2)
,就像引用数组的第一行,然后将2添加到地址:您将获得第一行的第三个元素的地址。但由于这仍然是一个指针,所以您添加了一个外部*(*x+2)
,以精确地获得第一行的第三个元素
*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。答案是一样的,但得到答案的方式却大不相同*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。答案是一样的,但得到答案的方式却大不相同typedef int Int5[5];
Int5 x[3];
x
是一个包含3个元素的数组。这三个元素中的每一个都是5整数的数组
- *x指的是什么李>
x
与'&x[0]相同,因此
*x与第一个5元素数组
x[0]`相同
- *(*x+2)+5指“8”。这是怎么发生的李>
*x
是x[0],而x+2
是&x[2]
所以*x+2
是&x[0][2]
和*(*x+2)
是x[0][2]
,正好是3。再加上五个,八个
- *(*x+2)与*(*x)+2相同吗李>
*(*x+2)
正如我们所看到的那样是x[0][2]
*(*x)
将是x[0][0],因此*(*x)+2
是x[0][0]+2
。所以*(*x+2)
和*(*x)+2
最终都等于3,但这只是巧合。这样想:
typedef int Int5[5];
Int5 x[3];
x
是一个包含3个元素的数组。这三个元素中的每一个都是5整数的数组
- *x指的是什么李>
x<