指向C中的结构数组的指针

时间:2016-12-06 14:32:41

标签: c

我需要使用指向结构数组的指针,如下所示:

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

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

tTest sTestStructure[20];

所以现在我想要定义一个指针并将stuct {sTestStructure [20]}的数组赋值给this指针。然后使用指针define来访问该结构的成员。 所以,请告诉我如何定义此指针以及如何使用指针访问成员。

2 个答案:

答案 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)也可以写为*arrPtrarrPtr[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]

<小时/>

  1. Postfix tTest sTestStructure[10][20]; tTest (*arrPtr)[20] = sTestStructure; 的优先级高于一元.,因此*会被解析为*ptr.u8Mem1,这不是您想要的。

答案 1 :(得分:0)

他们已经告诉过你如何定义指针,现在如果要访问属性将是* pointer-&gt;属性.....