马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
(.):平凡实体(非指针)利用,访问自身内部的成员
(->):指针变量利用,先寻址找到指向的实体,再访问实体内部的成员
看代码- #include <stdio.h>
- typedef struct Buffer
- {
- int a;
- } Buffer;
- int main()
- {
- Buffer buffer;
- buffer->a = 5; // 我们先看一下这样可不可以赋值
- printf("a=%d\n", buffer.a);
- return 0;
- }
复制代码 步调报错了[Error] base operand of '->' has non-pointer type 'Buffer'
[错误] -> 箭头运算符前面的操纵数,是非指针范例的 Buffer
意思是我们用(->)操纵的这个变量不是指针变量,以是报错了,那我们正常给它赋值并打印看一下- #include <stdio.h>
- typedef struct Buffer
- {
- int a;
- } Buffer;
- int main()
- {
- Buffer buffer;
- //buffer->a = 5;
- buffer.a = 5;
- printf("a=%d\n", buffer.a);
- return 0;
- }
复制代码 运行后可以看到控制台输出了一个"a=5"
那我们再界说一个Buffer范例的指针变量buffer1,将buffer的地点赋值给它,使buffer1指向buffer布局体,实行用(.)访问一下- #include <stdio.h>
- typedef struct Buffer
- {
- int a;
- } Buffer;
- int main()
- {
- Buffer buffer;
- //buffer->a = 5;
- buffer.a = 5;
- printf("a=%d\n",buffer.a);
-
- Buffer *buffer1=&buffer;
- //printf("a1=%d\n",buffer1.a);
- printf("a1=%d\n",buffer1->a);
- return 0;
- }
复制代码 [错误] 你试图用 . 访问变量 buffer1 的成员 a,但 buffer1 是指针范例 Buffer*,编译器提示:你是不是想用 ->?
看,编译器都提示了,指针变量不能用 . 访问成员,访问指针指向对象的成员要利用 ->,我们正常利用并打印一下看看
控制台输出"a=5 a1=5",我们再加一点代码- #include <stdio.h>
- typedef struct Buffer
- {
- int a;
- } Buffer;
- int main()
- {
- Buffer buffer;
- //buffer->a = 5;
- buffer.a = 5;
- printf("a=%d\n",buffer.a);
-
- Buffer *buffer1=&buffer;
- //printf("a1=%d\n",buffer1.a);
- printf("a1=%d\n",buffer1->a);
- buffer1->a=6;
- // 也可以用下面这种
- printf("a1=%d\n",(*buffer1).a); //(*buffer1).a == buffer1->a
- // 括号为什么不能省?因为*buffer1.a 会被编译器理解成 *(buffer1.a),直接报错,所以必须加括号 (*buffer1).a
- printf("a=%d\n",buffer.a);
- return 0;
- }
复制代码
完备代码,过细看一遍就能明白什么时间用(.),什么时间用(->)了,回到开头
(.):平凡实体(非指针)利用,访问自身内部的成员
(->):指针变量利用,先寻址找到指向的实体,再访问实体内部的成员
|