我需要使用指向结构数组的指针,如下所示:
typedef void (*fptr)(uint8 arg);
typedef struct sTest
{
uint8 u8Mem1;
uint8 u8Mem2;
fptr fptr1;
}tTest;
现在我已经定义了这个结构的数组,如下所示:
tTest sTestStructure[20];
所以现在我想要定义一个指针并将stuct {sTestStructure [20]}的数组赋值给this指针。然后使用指针define来访问该结构的成员。 所以,请告诉我如何定义此指针以及如何使用指针访问成员。
答案 0 :(得分:1)
请记住,除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,表达式类型为“{元素数组T
”(T [N]
)的类型将被转换(“衰减”)为“指向T
”的类型的表达式(T *
) ,表达式的值将是数组第一个元素的地址。
这自然会引导我们:
tTest *ptr = sTestStructure; // note no & operator!
表达式 sTestStructure
被隐式转换为“tTest
的20个元素数组”到“指向tTest
的指针”,以及表达式与&sTestStructure[0]
相同。要访问sTestStructure
的任何元素,您只需索引ptr
,就像sTestStructure
一样:
ptr[i].u8Mem1 = some_value; // sTestStructure[i].u8Mem1 = some_value
printf( "%" PRIu8 "\n", ptr[j].u8Mem2 );
请记住,下标操作a[i]
已定义为*(a + i)
;给定地址a
,从该地址偏移i
元素并推断结果。因此,[]
运算符隐式取消引用ptr
,这就是我们使用.
运算符访问每个结构成员的原因。
或者,您也可以使用->
运算符访问struct成员,并根据需要推进指针:
tTest *ptr = sTestStructure;
while( ptr->u8Mem1 != some_value ) // no subscript operation here
ptr++;
表达式ptr->u8Mem1
相当于(*ptr).u8Mem1
1 ,相当于ptr[0].u8Mem1
。
那么如果我们决定使用&sTestStructure
会发生什么呢?由于sTestStructure
是一元&
运算符的操作数,因此上述转换规则不适用;而不是获得指向tTest
指针的指针,我们得到一个指向tTest
的 20元素数组的指针,或者:
tTest (*arrPtr)[20] = &sTestStructure;
这提出了更多的挑战,因为我们必须在之前取消引用{/ 1}} 我们可以将其编入索引:
arrPtr
由于(*arrPtr)[i].u8Mem1 = some_value;
printf( "%" PRIu8 "\n", (*arrPtr)[j].u8Mem2 );
定义为a[i]
,因此表达式*(a + i)
也可以写为*arrPtr
(arrPtr[0]
)。那些
行也可以写成
*arrPtr == *(arrPtr + 0) == arrPtr[0]
从最后几行可以看出,除非你正在处理多维数组,否则你通常不会看到这种形式的数组指针。还记得我们的转换规则,其中arrPtr[0][i].u8Mem1 = some_value;
printf( "%" PRIu8 "\n", arrPtr[0][j].u8Mem2 );
类型的表达式转换为T [N]
类型的表达式吗?好吧,用T *
之类的数组类型替换T
,然后我们从“Q[M]
的M元素数组的N元素数组”(Q
)转换为“指向Q [N][M]
的M元素数组的指针”(Q
):
Q (*)[M]
<小时/>
tTest sTestStructure[10][20];
tTest (*arrPtr)[20] = sTestStructure;
的优先级高于一元.
,因此*
会被解析为*ptr.u8Mem1
,这不是您想要的。
答案 1 :(得分:0)
他们已经告诉过你如何定义指针,现在如果要访问属性将是* pointer-&gt;属性.....