如何取消引用整数的 2d 数组


#include <stdio.h>
typedef struct
{
  int (*p)[2][2];
} S;
int main()
{
  int aa[2][2] = {{1, 2}, {3, 4}};
  S s = { .p = &aa };
  printf("Four: %pn", s.p[1][1]);
  return 0;
}

我希望打印"4",但我得到了一个内存位置。

您可以像任何其他指针一样取消引用它,使用一元*运算符。

但是,您必须注意,运算符优先级

将在此处发挥作用,因为数组下标运算符的优先级高于取消引用运算符。因此,您必须做例如

(*s.p)[x][y]

此外,您使用错误的格式来打印整数。"%p"格式是打印实际指针,而不是整数。使用 "%d"


作为替代方法,请记住,数组自然衰减到指向其第一个元素的指针。这意味着对于你的数组aa,像这样使用它会衰减到 &aa[0] ,它是 int (*)[2] 类型。这意味着你可以使你的变量成为相同的类型,并在初始化中使用纯aa,并像普通的"2d"数组一样使用它:

typedef struct
{
  int (*p)[2];
} S;
int main()
{
  int aa[2][2] = {{1, 2}, {3, 4}};
  S s = { .p = aa };  // Note: Not using the address-of operator here
  printf("Four: %dn", s.p[1][1]);  // Using array-indexing works as expected here
  return 0;
}

p是指向int (*p)[2][2];中的数组的指针,它不是您尝试打印的2D array

取代

printf("Four: %pn", s.p[1][1]);/** %p is format specifier to prints the address, Instead use %d to print value **/

printf("Four: %dn", (*s.p)[1][1]);

s 是一个包含指向二维数组的指针的结构。因此,使用"s.p",您可以获得指向二维数组的指针。考虑到:

(*(s.p))[1][1]

会为你做工作。

我猜您不打算使用 %p 占位符,因为它用于打印地址。

最新更新