C语言里.
和->
的区别
今天写代码时,遇到一个很明显,但是困住我这个小白的错误:
...错误:在非结构或联合中请求成员‘data’
switch_core_file_write(rh->fh, mask ? null_data : rnnoise_clone.data, &len)
很明显是rnnoise_clone.data
用错了。为什么呢?
首先看一下定义:
->
:->
是C语言和C++语言的一个运算符,叫做指向结构体成员运算符,用处是使用一个指向结构体或对象的指针访问其内成员。(引用自百度百科什么是“->”)
.
:.
并不是一个运算符,它只是一个断点符号,它指向的是结构体或者对象。
好吧,看完定义并没有看明白。下面我们来翻译一下:
->
是通过一个结构体或对象指针来访问他们的内部成员变量;
.
是直接通过结构体或对象来访问他们的内部成员变量。
在网上找到一个很便于记忆的方式:
a->b
读作a指向结构体的b
a.b
读作a的b
区别总结
那么区别就显而易见了,->
前面肯定是结构体指针或对象指针;.
前面的是一个结构体或对象。
下面我们通过代码直观的了解一下:
switch_frame_t frame = { 0 };
switch_frame_t *rnnoise_clone;
frame.data = data; //OK,因为frame是一个switch_frame_t的结构体
rnnoise_clone->data = data; //OK,因为rnnoise_clone是一个switch_frame_t类型的结构体指针
为什么会这样?
其实两者的作用是一样的,那么为什么会重复制造轮子呢?
翻了一下书,找了几个网站,觉得最能说服我的就是这句话了:
早期的C语言不支持将结构体作为参数在函数之间传递,只能用指向结构的指针在函数间进行传递。
emmm