C语言中“.”与->的区别

写过C语言的各位朋友刚开始的时候一定受过这俩个混淆的坑吧。 看着感觉这俩个差不多啊,都是可以指向一个结构体的元素。但是,往往我们写的时候感觉错误百出:
下面我指出这俩个混淆的错误:

这里写图片描述

代码附上:

这里写图片描述

在上图我们看到报错6个地方都是对结构体内元素操作时候出错了:
接下来我们翻一下刚才的报错看是什么原因:

error: request for member ‘ain something not a structure or union
//错误:在非结构体或联合体的情况下请求成员a
error: invalid type argument of ‘->’ (have ‘A’)
//错误:“->”(“A”)的无效类型参数

而我们重新认识以下”.”和->的定义和使用:
A.a:

The member access expression designates the named member of the struct or union designated by its left operand. It has the same value category as its left operand.
//成员访问表达式指定由其左操作数指定的结构或联合的命名成员。它具有与左操作数相同的值类别。

A->a:

The member access through pointer expression designates the named member of the struct or union type pointed to by its left operand. Its value category is always lvalue.
//通过指针表达式的成员访问指定由其左操作数指向的结构或联合类型的命名成员。它的值l类别始终是左值。

简单点说就是:
A->a表示A是指向结构体的指针
A.a表示A是结构体
A->a等效于(*A).a

那我们将上面的代码改一下:
这里写图片描述

而我们要是还看得不怎么明白的话,我们只需要查看一下主函数的node和调用函数的node大小是多少即可:
这里写图片描述

看到上图的运行结果,我们心中应该或许明白了点什么吧:
因为我的系统是64位的,所指针的大小是8个比特位,
(为了好区分,我将结构体加了点东西,不然效果看不出来)
我们可以看到主函数的node是大小是12,而调用函数内部变成了8

在这个时候我们应该明白了点什么吧,就是我们传参时候是传了结构体的地址,所以调用函数内部的node就是指向主函数node的一个结构体指针。

这里涉及到了机构体传参的值传递引用传递这俩个知识点,我在下面的博客中会讲到的!!

希望朋友们有收获,以后.->千万不要用错了!!!

猜你喜欢

转载自blog.csdn.net/q496958148/article/details/80149634
今日推荐