C 二维数组地址
我有如下两种结构C 二维数组地址,c,C,我有如下两种结构 typedef struct Rsp_s { u8 code; u8 Count; }Rsp_t; typedef struct Field_s { u8 State; u8 present; u8 previous; u8 event; } Field_t 那我有 Rsp_t *rsp; Field_t data[3][7] 我希望数据[0][0]遵循rsp->Count。 我该怎么做
typedef struct Rsp_s {
u8 code;
u8 Count;
}Rsp_t;
typedef struct Field_s {
u8 State;
u8 present;
u8 previous;
u8 event;
} Field_t
那我有
Rsp_t *rsp;
Field_t data[3][7]
我希望数据[0][0]
遵循rsp->Count
。
我该怎么做
data = (Field_t *)(&(rsp->Count) +1);
不要这样做。你的作业是错误的。您想将
b[0][0]
的地址分配给a
,因此:
a = &b[0][0];
当您声明这样的变量时
int b[3][7];
。。。如果静态
,它的内存位置由编译器指定;如果自动
自动,它的内存位置由堆栈指定,因此不能通过编程更改。不过,您可以使用指针访问此内存,并从中进行读写
int (*a)[7] = b;
以下是等效的:
b[0][0] = b[1][1];
a[0][0] = a[1][1];
你已经交换了订单。您还需要将
a
声明为指向int指针的指针&b[0][0]=a
尝试将&b[0][0]
的值设置为a
。但是&b[0][0]
无法修改,因为它是固定的。因此您看到的错误。实际上我错了,a=&b[0][0]
似乎是合法的,但你肯定不能用[][]
@Ben取消对它的引用,当然可以;您只需要进行一些转换,如下所示:((int**)a)[0][0]=1代码>并不是说这可能是一件有用的事情,但这是C,你可以开枪打自己的脚。@user3821434我想你不知道你在做什么want@user3821434,安东在上面所做的就是这样。这样做并不能用a替换b的基,而是将a指向b的基。我认为您还应该补充以下内容是合法的并且有效的:int*a=(int*)b[0]代码>获取指向连续内存的一维指针。我总是用int*a=&b[0][0]
因为我更喜欢它,但每个人都有自己的想法。为了澄清,当他说下面的说法是等价的时,另一种说法是&pb[x][y]=&b[x][y]
我以前从未见过这样的:int(*pb)[7]
。你到底在这里干什么?@sherrellbcint(*a)[7]
声明了一个变量,一个指向二维数组的指针,大小为[n][7]
int*a[7]
将声明7个变量,每个变量都是指向单个int
或1Dint
数组的指针,大小为[n]
。