根据不同的线程,我了解到将 '&' 与数组一起使用不会返回双指针,而是返回一个指针数组。
int x[9] = {11, 22,33,44,55,66,77,88,99};
int (*xpt)[9] = &x; <---This is the focus of this thread.
以下代码编译并执行。
#include <stdio.h>
int main ()
{
int x[9] = {11, 22,33,44,55,66,77,88,99};
int (*xpt)[9] = &x;
printf("xpt[0] = %d\n", xpt[0]);
printf("xpt[0][0] = %d\n", xpt[0][0]);
printf("xpt[0][1] = %d\n", xpt[0][1]);
printf("*xpt[0] = %d\n", *xpt[0]);
printf("*xpt[1] = %d\n", *xpt[1]);
return 0;
}
这是输出。
> ./runThis
xpt[0] = 155709776
xpt[0][0] = 11
xpt[0][1] = 22
*xpt[0] = 11
*xpt[1] = 32766
问题与输出有关。
由于 xpt 是一个数组指针(我假设) xpt[0] 只是显示第一个值 11 的地址。
我有点惊讶以下 2 行工作。
xpt[0][0] = 11
xpt[0][1] = 22
考虑之后,这几乎是有道理的,因为我在想 xpt[0] 和 *xpt 可以互换使用,直到以下两行反驳:
*xpt[0] = 11
*xpt[1] = 32766
为什么 *xpt[0] 返回预期值而不是 *xpt[1] ?
最佳答案
获取数组元素应该是(*xpt)[0]
。否则你在这里有未定义的行为。因为您正在访问一些超出界限或您不应该/或您无权访问的内存。
也不要对 xpt[0][0]
感到惊讶,这与我上面所说的相同。
原因是 - *xpt[1]
正在取消引用甚至不指向数组任何元素的内存。这是未定义的行为。
123456789XXXXXXXXXX
^ ^
| |
xpt[0] xpt[1]
这里
1234....
表示数组的元素,xpt[1]
指向数组外。此外,数组下标(
[]
)的优先级高于取消引用( *
)。因此,当您编写 *xpt[1]
时,它会首先计算 xpt[1]
,然后尝试获取它的值,这会导致程序中出现未定义的行为。还为了让您对如何理解这一点有一个更好的直观想法 -
指针操作由它指向的内容决定。在这里,当你宣布
int (*xpt)[9] = &x;
据说
xpt
是一个指向 int
9 个元素数组的指针。现在您使用 x
的地址进行初始化。现在想想它指向什么?它是数组对象 x
。那么如果我们这样做 xpt[1]
会指向什么呢?下一个数组对象(如果有)。所以这就是为什么我们首先到达地址然后取消引用它以到达数组 (*xpt)
,现在使用数组下标来获取正确的元素。int* xpt = &x
是编译器会提示的东西。它将类型
int(*)[9]
分配给 int*
- 这是错误的。类型对指针很重要——这就是编译器会提示的原因。你可能会问为什么
*xpt[0]
是 11
而不是 22
或 33
等更有趣的事情?事情是
xpt[0]
是 xpt
指向的数组。数组 xpt[0]
转换(衰减)为指向数组( xpt[0][0]
)的第一个元素( xpt[0]
)的指针,然后您取消引用( *xpt[0]
)它。这就是为什么您将数组的第一个元素作为值的原因。关于c - 数组指针未返回预期值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48429022/