先看例子:
1#include <stdio.h>
2void main(){
3 typedef struct {
4 int int_field;
5 char char_field;
6 } my_struct;
7 my_struct my_s;
8 my_s.int_field=3; //结构运算符访问结构成员
9 my_struct *s;
10 s=(my_struct *)malloc (sizeof(my_struct));
11 s->int_field=4;
12 s->char_field='a';
13 (*s).int_field=6;
14 }
访问结构体成员的运算符有两种,一种是“.”即结构运算符,另一种是“->”即结构指针运算符。
结构运算符是通过结构变量名访问结构体成员的(例如例子的第8行),而结构指针运算符是通过指向结构的指针访问结构成员的(例如第11及12行)。
还可以用指针和结构运算符来访问结构(如第13行),其中(*s)中的圆括号不可以省去
平时看简单例子看惯的缘故,本来以为很简单的知识。可是正到了项目上遇到了就有中把握不住的感觉,还是由于看的少的原因,所以不要只停留在理论的基础上。还是看项目源代码:
。。。。
。。。。
1. enum {
LIGHT_INDEX_BACKLIGHT = 0,
LIGHT_INDEX_KEYBOARD = 1,
LIGHT_INDEX_BUTTONS = 2,
LIGHT_INDEX_BATTERY = 3,
LIGHT_INDEX_NOTIFICATIONS = 4,
LIGHT_INDEX_ATTENTION = 5,
LIGHT_INDEX_BLUETOOTH = 6,
LIGHT_INDEX_WIFI = 7,
LIGHT_COUNT
};
2. struct Devices {
light_device_t* lights[LIGHT_COUNT];
};
。 。 。
。 。 。
static jint init_native(JNIEnv *env, jobject clazz)
{
int err;
hw_module_t* module;
Devices* devices;
devices = (Devices*)malloc(sizeof(Devices));
err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
if (err == 0) {
3. devices->lights[LIGHT_INDEX_BACKLIGHT]
= get_device(module, LIGHT_ID_BACKLIGHT);
devices->lights[LIGHT_INDEX_KEYBOARD]
= get_device(module, LIGHT_ID_KEYBOARD);
devices->lights[LIGHT_INDEX_BUTTONS]
= get_device(module, LIGHT_ID_BUTTONS);
。 。 。
。 。 。
}
}
其中1 2 两处在上一篇 “C 中枚举(项目里遇到的)例子“ 中介绍过了。 3处 devices 是一个指向Devices型(结构体)的指针,devices->lights[LIGHT_INDEX_BACKLIGHT]即是访问到了Devices成员lights的第一个元素。
也无非就这么三种用法,熟悉了以后项目再遇到就很简单!