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;
}

image

完整代码,仔细看一遍就能理解什么时候用(.),什么时候用(->)了,回到开头

(.):普通实体(非指针)使用,访问自身内部的成员

(->):指针变量使用,先寻址找到指向的实体,再访问实体内部的成员

 

posted @ 2026-06-17 10:31  沉默的王さん  阅读(5)  评论(0)    收藏  举报