引用结构体成员时,有时用点运算符( . ),时而是用箭头运算符( -> );两者之间的使用有什么区别?
相同点:两者都是二元操作符,而且右边的操作数都是成员的名称。
不同点:点运算符( . )的左边操作数是一个结果为结构的表达式;
箭头运算符( -> )的左边的操作数是一个指向结构体的指针。
1 typedef struct // 定义一个结构体类型:DATA 2 { 3 char key[10]; // 结构体成员:key 4 char name[20]; // 结构体成员:name 5 int age; // 结构体成员:age 6 }DATA; 7 8 DATA data; // 声明一个结构体变量 9 DATA *pdata; // 声明一个指向结构体的指针 10 11 // 访问数据操作如下: 12 data.age = 24; // 结构体变量通过点运算符( . )访问 13 pdata->age = 24; // 指向结构体的指针通过箭头运算符( -> )访问
如果一个函数的传入参数是结构体,且需要该结构体作为返回值的时候,必须采用指针传递的方式,其中对结构体赋值必须使用箭头运算符
eg:
1 int do_history(int acceptfd, MSG *msg, sqlite3 *db) 2 { 3 char sql[128] = {}; 4 char *errmsg; 5 6 sprintf(sql, "select * from record where name = '%s'", msg->name); 7 ....... 8 }
如果只是想访问结构体成员,使用 .
1 int history_callback(void* arg,int f_num,char** f_value,char** f_name) 2 { 3 // record , name , date , word 4 int acceptfd; 5 MSG msg; 6 7 acceptfd = *((int *)arg); 8 9 sprintf(msg.data, "%s , %s", f_value[1], f_value[2]); 10 11 send(acceptfd, &msg, sizeof(MSG), 0); 12 13 return 0; 14 }