C语言:struct中(.)和(->)的区别
(.):普通实体(非指针)使用,访问自身内部的成员
(->):指针变量使用,先寻址找到指向的实体,再访问实体内部的成员
看代码
#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;
}

完整代码,仔细看一遍就能理解什么时候用(.),什么时候用(->)了,回到开头
(.):普通实体(非指针)使用,访问自身内部的成员
(->):指针变量使用,先寻址找到指向的实体,再访问实体内部的成员
浙公网安备 33010602011771号