根据不同的线程,我了解到将 '&' 与数组一起使用不会返回双指针,而是返回一个指针数组。

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 而不是 2233 等更有趣的事情?

事情是 xpt[0]xpt 指向的数组。数组 xpt[0] 转换(衰减)为指向数组( xpt[0][0] )的第一个元素( xpt[0] )的指针,然后您取消引用( *xpt[0] )它。这就是为什么您将数组的第一个元素作为值的原因。

关于c - 数组指针未返回预期值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48429022/

10-12 15:05