user-0 提问: 通过数组下标访问结构体成员可以这样写吗？

回复:
user: user-1
content: 引用 10 楼 mbtmxk 的回复:[quote=引用 8 楼 cfjtaishan 的回复:] [quote=引用 7 楼 mbtmxk 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 mbtmxk 的回复:]  WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。[/quote]  WdgM_runTimeMod这个是指针，如果WdgMTrigger也是指针， 就可以用下标的方式来访问吗？那么 (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这个表达式得到的结果是什么？是指针WdgMTrigger的首地址吗？[/quote] WdgMTrigger这个是指针吗？[/quote]   typedef struct  {      uint8               WdgMWatchdogDeviceRef;      uint16              WdgMTriggerConditionValue;      WdgIf_ModeType      WdgMWatchdogMode;  } WdgM_TriggerType;    typedef struct  {      uint16                                                         WdgMExpiredSupervisionCycleTol;      WdgM_CheckPointInModeCfgType           WdgCpInMode;     WdgM_AliveSupervisionType                     WdgMAliveSupervision;       WdgM_DeadlineSupervisionType            WdgMDeadlineSupervision;      WdgM_TriggerType*                                   WdgMTrigger;      WdgM_LocalStatusParamsType                WdgMLocalStatusParams;      uint16                                                           numOfAlive;      uint16                                                           numOfDeadline;      uint8                                                             numOfTrigger;      uint16                                                           numOfLocalStatus;   } WdgM_ModeCfgType;     WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  }; WdgM_runTimeMode，WdgMTrigger都是指针，那么dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样的写法可以吗？得到的结果究竟是什么呢[/quote] WdgMTrigger这个是指针，那么就能说得通这个表达式了。 WdgMTrigger指向一个WdgM_TriggerType类型的数组或者指向堆上的空间的话，可以按照数组的形式访问，就是这样的表达式。 dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex 这个值是多少，要看你初始化什么了 WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  }; ，或者在这个表达式之前还应该有对WdgMTrigger操作的吗？

user: user-2
content: 不可以，要么你看错了，要么他写的不是C++代码。

user: user-0
content: 引用 8 楼 cfjtaishan 的回复:[quote=引用 7 楼 mbtmxk 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 mbtmxk 的回复:]  WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。[/quote]  WdgM_runTimeMod这个是指针，如果WdgMTrigger也是指针， 就可以用下标的方式来访问吗？那么 (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这个表达式得到的结果是什么？是指针WdgMTrigger的首地址吗？[/quote] WdgMTrigger这个是指针吗？[/quote]   typedef struct  {      uint8               WdgMWatchdogDeviceRef;      uint16              WdgMTriggerConditionValue;      WdgIf_ModeType      WdgMWatchdogMode;  } WdgM_TriggerType;    typedef struct  {      uint16                                                         WdgMExpiredSupervisionCycleTol;      WdgM_CheckPointInModeCfgType           WdgCpInMode;     WdgM_AliveSupervisionType                     WdgMAliveSupervision;       WdgM_DeadlineSupervisionType            WdgMDeadlineSupervision;      WdgM_TriggerType*                                   WdgMTrigger;      WdgM_LocalStatusParamsType                WdgMLocalStatusParams;      uint16                                                           numOfAlive;      uint16                                                           numOfDeadline;      uint8                                                             numOfTrigger;      uint16                                                           numOfLocalStatus;   } WdgM_ModeCfgType;     WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  }; WdgM_runTimeMode，WdgMTrigger都是指针，那么dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样的写法可以吗？得到的结果究竟是什么呢

user: user-3
content: 仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-1
content: 引用 7 楼 mbtmxk 的回复:[quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 mbtmxk 的回复:]  WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。[/quote]  WdgM_runTimeMod这个是指针，如果WdgMTrigger也是指针， 就可以用下标的方式来访问吗？那么 (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这个表达式得到的结果是什么？是指针WdgMTrigger的首地址吗？[/quote] WdgMTrigger这个是指针吗？

user: user-0
content: 引用 6 楼 cfjtaishan 的回复:[quote=引用 5 楼 mbtmxk 的回复:]  WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。[/quote]  WdgM_runTimeMod这个是指针，如果WdgMTrigger也是指针， 就可以用下标的方式来访问吗？那么 (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这个表达式得到的结果是什么？是指针WdgMTrigger的首地址吗？

user: user-1
content: 引用 5 楼 mbtmxk 的回复:WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。

user: user-0
content: WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑

user: user-0
content: 引用 12 楼 cfjtaishan 的回复:[quote=引用 10 楼 mbtmxk 的回复:] [quote=引用 8 楼 cfjtaishan 的回复:] [quote=引用 7 楼 mbtmxk 的回复:] [quote=引用 6 楼 cfjtaishan 的回复:] [quote=引用 5 楼 mbtmxk 的回复:]  WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  };  dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样可以吗？ 其实我主要是想知道通过下标的方式访问非数组类型的结构体变量可以吗？ 我看别人这样写代码竟然调试没问题，我感到很困惑 WdgM_runTimeMod这个是指针呢，那你开始定义的不是指针。  另外，如果这样写，那么结构体定义里的WdgMTrigger是不是也是指针呢？ 提问题，建议把问题描述的更清晰和准确一些。[/quote]  WdgM_runTimeMod这个是指针，如果WdgMTrigger也是指针， 就可以用下标的方式来访问吗？那么 (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这个表达式得到的结果是什么？是指针WdgMTrigger的首地址吗？[/quote] WdgMTrigger这个是指针吗？[/quote]   typedef struct  {      uint8               WdgMWatchdogDeviceRef;      uint16              WdgMTriggerConditionValue;      WdgIf_ModeType      WdgMWatchdogMode;  } WdgM_TriggerType;    typedef struct  {      uint16                                                         WdgMExpiredSupervisionCycleTol;      WdgM_CheckPointInModeCfgType           WdgCpInMode;     WdgM_AliveSupervisionType                     WdgMAliveSupervision;       WdgM_DeadlineSupervisionType            WdgMDeadlineSupervision;      WdgM_TriggerType*                                   WdgMTrigger;      WdgM_LocalStatusParamsType                WdgMLocalStatusParams;      uint16                                                           numOfAlive;      uint16                                                           numOfDeadline;      uint8                                                             numOfTrigger;      uint16                                                           numOfLocalStatus;   } WdgM_ModeCfgType;     WdgM_TriggerType dog;   WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  }; WdgM_runTimeMode，WdgMTrigger都是指针，那么dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex] 这样的写法可以吗？得到的结果究竟是什么呢[/quote] WdgMTrigger这个是指针，那么就能说得通这个表达式了。 WdgMTrigger指向一个WdgM_TriggerType类型的数组或者指向堆上的空间的话，可以按照数组的形式访问，就是这样的表达式。 dog = (WdgM_runTimeMode->WdgMTrigger) [dogIndex 这个值是多少，要看你初始化什么了 WdgM_ModeCfgType* WdgM_runTimeMode ={  //初始化  }; ，或者在这个表达式之前还应该有对WdgMTrigger操作的吗？[/quote]   除了初始化没有其他操作了，另外结构体变量可以直接用 “=”  赋值？

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:[quote=引用 1 楼 mbtmxk 的回复:] 求教大神们，全部的积分都贡献出来了 WdgMTrigger不是数组，为什么要用[]呢？ 另外WdgM_runTimeMode不是指针，为什么要用->?  由于WdgMTrigger类型和dog类型匹配，可以直接赋值； dog = WdgM_runTimeMode.WdgMTrigger; [/quote]   我感到困惑的是(WdgM_runTimeMode->WdgMTrigger)[dogIndex]; 这个引用竟然编译时不报错，理论上来说应该编译不通过的

user: user-1
content: 引用 3 楼 mbtmxk 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] [quote=引用 1 楼 mbtmxk 的回复:] 求教大神们，全部的积分都贡献出来了 WdgMTrigger不是数组，为什么要用[]呢？ 另外WdgM_runTimeMode不是指针，为什么要用->?  由于WdgMTrigger类型和dog类型匹配，可以直接赋值； dog = WdgM_runTimeMode.WdgMTrigger; [/quote]   我感到困惑的是(WdgM_runTimeMode->WdgMTrigger)[dogIndex]; 这个引用竟然编译时不报错，理论上来说应该编译不通过的[/quote] 肯定编译不过去，因为结构体变量当结构体指针使用，这个基本错误编译器不会找不出来的。 建议贴出你的codes

user: user-1
content: 引用 1 楼 mbtmxk 的回复:求教大神们，全部的积分都贡献出来了 WdgMTrigger不是数组，为什么要用[]呢？ 另外WdgM_runTimeMode不是指针，为什么要用->?  由于WdgMTrigger类型和dog类型匹配，可以直接赋值； dog = WdgM_runTimeMode.WdgMTrigger;

user: user-0
content: 求教大神们，全部的积分都贡献出来了