结构体->和 . 的区别(转载)

引用结构体成员时,有时用点运算符( . ),时而是用箭头运算符( -> );两者之间的使用有什么区别?

相同点:两者都是二元操作符,而且右边的操作数都是成员的名称。
不同点:点运算符( . )的左边操作数是一个结果为结构的表达式;
              箭头运算符( -> )的左边的操作数是一个指向结构体的指针。

 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 }



原文地址:https://www.cnblogs.com/y4247464/p/12250823.html