gpt4 book ai didi

c - C 中结构体数组的指针

转载 作者:行者123 更新时间:2023-11-30 15:02:34 24 4
gpt4 key购买 nike

我需要使用指向如下定义的结构数组的指针:

typedef void (*fptr)(uint8 arg);
typedef struct sTest
{
uint8 u8Mem1;
uint8 u8Mem2;
fptr fptr1;
}tTest;

现在我定义了这个结构的数组,如下所示:

tTest sTestStructure[20];

所以现在我想定义一个指针并将stuct{sTestStructure[20]}数组分配给这个指针。然后使用指针定义访问这个结构体的成员。所以请让我知道如何定义这个指针以及如何使用指针访问成员。

最佳答案

请记住,除非它是 sizeof 或一元 & 运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则 T 的 N 元素数组”类型的表达式 (T [N]) 将被转换(“衰减”)为“T”类型的表达式指向 T"(T *) 的指针,表达式的值将是数组第一个元素的地址。

这自然会引导我们得出以下结论:

tTest *ptr = sTestStructure;  // note no & operator!

表达式 sTestStructure 从类型“tTest 的 20 元素数组”隐式转换为“指向 tTest 的指针” code>”,表达式的值与&sTestStructure[0]相同。要访问 sTestStructure 的任何元素,您只需像 sTestStructure 一样索引到 ptr 即可:

ptr[i].u8Mem1 = some_value;                // sTestStructure[i].u8Mem1 = some_value
printf( "%" PRIu8 "\n", ptr[j].u8Mem2 );

请记住,下标运算a[i]定义*(a + i);给定地址a,从该地址偏移i 元素并取消引用结果。因此,[] 运算符隐式取消引用 ptr,这就是我们使用 . 运算符访问每个结构体成员的原因。

或者,您还可以使用 -> 运算符访问结构成员,并根据需要推进指针:

tTest *ptr = sTestStructure;
while( ptr->u8Mem1 != some_value ) // no subscript operation here
ptr++;

表达式ptr->u8Mem1相当于(*ptr).u8Mem11,相当于ptr[ 0].u8Mem1

那么如果我们决定使用 &sTestStructure 会发生什么?由于sTestStructure是一元&运算符的操作数,因此上面的转换规则不适用;我们获取的不是指向 tTest 的指针,而是指向 tTest20 元素数组 的指针,或者:

tTest (*arrPtr)[20] = &sTestStructure;

这提出了更多的挑战,因为我们必须先取消引用 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] 之类的数组类型,我们就可以从“N 元素数组到 M 元素数组 Q” (Q [N][M]) 到“指向 Q 的 M 元素数组的指针” (Q (*)[M]):

tTest sTestStructure[10][20];
tTest (*arrPtr)[20] = sTestStructure;

<小时/>

  1. Postfix . 的优先级高于一元 *,因此 *ptr.u8Mem1 将被解析为 *(ptr.u8Mem1 ),这不是您想要的。

关于c - C 中结构体数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40997798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com