#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 占位符,因为它用于打印地址。