C语言:struct中(.)和(->)的区别

[复制链接]
发表于 2026-6-17 09:01:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
(.):平凡实体(非指针)利用,访问自身内部的成员
(->):指针变量利用,先寻址找到指向的实体,再访问实体内部的成员
看代码
  1. #include <stdio.h>
  2. typedef struct Buffer
  3. {
  4.     int a;
  5. } Buffer;
  6. int main()
  7. {
  8.     Buffer buffer;
  9.     buffer->a = 5; // 我们先看一下这样可不可以赋值
  10.     printf("a=%d\n", buffer.a);
  11.     return 0;
  12. }
复制代码
步调报错了[Error] base operand of '->' has non-pointer type 'Buffer'
[错误] -> 箭头运算符前面的操纵数,是非指针范例的 Buffer
意思是我们用(->)操纵的这个变量不是指针变量,以是报错了,那我们正常给它赋值并打印看一下
  1. #include <stdio.h>
  2. typedef struct Buffer
  3. {
  4.         int a;
  5. } Buffer;
  6. int main()
  7. {
  8.         Buffer buffer;
  9.         //buffer->a = 5;
  10.         buffer.a = 5;
  11.         printf("a=%d\n", buffer.a);
  12.         return 0;
  13. }
复制代码
运行后可以看到控制台输出了一个"a=5"
那我们再界说一个Buffer范例的指针变量buffer1,将buffer的地点赋值给它,使buffer1指向buffer布局体,实行用(.)访问一下
  1. #include <stdio.h>
  2. typedef struct Buffer
  3. {
  4.         int a;
  5. } Buffer;
  6. int main()
  7. {
  8.         Buffer buffer;
  9.         //buffer->a = 5;
  10.         buffer.a = 5;
  11.         printf("a=%d\n",buffer.a);
  12.        
  13.         Buffer *buffer1=&buffer;
  14.         //printf("a1=%d\n",buffer1.a);
  15.         printf("a1=%d\n",buffer1->a);       
  16.         return 0;
  17. }
复制代码
[错误] 你试图用 . 访问变量 buffer1 的成员 a,但 buffer1 是指针范例 Buffer*,编译器提示:你是不是想用 ->?
看,编译器都提示了,指针变量不能用 . 访问成员,访问指针指向对象的成员要利用 ->,我们正常利用并打印一下看看
控制台输出"a=5 a1=5",我们再加一点代码
  1. #include <stdio.h>
  2. typedef struct Buffer
  3. {
  4.         int a;
  5. } Buffer;
  6. int main()
  7. {
  8.         Buffer buffer;
  9.         //buffer->a = 5;
  10.         buffer.a = 5;
  11.         printf("a=%d\n",buffer.a);
  12.        
  13.         Buffer *buffer1=&buffer;
  14.         //printf("a1=%d\n",buffer1.a);
  15.         printf("a1=%d\n",buffer1->a);
  16.         buffer1->a=6;
  17.     // 也可以用下面这种
  18.         printf("a1=%d\n",(*buffer1).a);  //(*buffer1).a == buffer1->a
  19.     // 括号为什么不能省?因为*buffer1.a 会被编译器理解成 *(buffer1.a),直接报错,所以必须加括号 (*buffer1).a
  20.         printf("a=%d\n",buffer.a);
  21.         return 0;
  22. }
复制代码

完备代码,过细看一遍就能明白什么时间用(.),什么时间用(->)了,回到开头
(.):平凡实体(非指针)利用,访问自身内部的成员
(->):指针变量利用,先寻址找到指向的实体,再访问实体内部的成员
 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表