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


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

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

     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 }



  • 相关阅读:
    newifi3-D2 openwrt挂载u盘扩容/overlay
    # mac使用homebrew安装jdk和tomcat
    React学习小记--setState的同步与异步
    [vscode直接运行js文件报错]: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
    # js权威指南之对象篇
    # 初体验之腾讯位置服务彩云天气开发者api
    自用资源合集(持续更新)
    网页嵌入播客
    网页嵌入音乐歌单
    All live
  • 原文地址:https://www.cnblogs.com/y4247464/p/12250823.html
Copyright © 2020-2023  润新知