Moh*_*nde 245 c syntax pointers
我目前正在通过阅读一本名为"21天自学C"的好初学者的书来学习C(我已经学习了Java和C#,所以我的动作速度要快得多).我正在阅读有关指针的章节,而 - >(箭头)操作符出现时没有解释.我认为它用于调用成员和函数(比如.(点)运算符,但是用于指针而不是成员).但我不完全确定.我可以获得解释和代码示例吗?
sep*_*p2k 435
foo->bar相当于(*foo).bar,即它bar从结构中调用foo指向的成员.
Jac*_*ack 119
对,就是那样.
当您想要访问作为指针而不是引用的struct/class的元素时,它只是点版本.
struct foo
{
int x;
float y;
};
struct foo var;
struct foo* pvar;
pvar = malloc(sizeof(pvar));
var.x = 5;
(&var)->y = 14.3;
pvar->y = 22.4;
(*pvar).x = 6;
Run Code Online (Sandbox Code Playgroud)
而已!
Luk*_*iak 24
我只是在答案中加上"为什么?".
.是标准成员访问运算符,其优先级高于*指针运算符.
当你试图访问struct的内部并且你编写它时,*foo.bar编译器会认为想要一个'bar'元素'foo'(这是一个内存中的地址),显然这个地址没有任何成员.
因此,你需要让编译器首先取消引用whith (*foo),然后访问成员元素:(*foo).bar这有点笨拙,所以好人们想出了一个速记版本:foo->bar这是指针运算符的一种成员访问.
小智 10
struct Node {
int i;
int j;
};
struct Node a, *p = &a;
Run Code Online (Sandbox Code Playgroud)
这里访问的价值观i和j我们可以使用变量a和指针p如下:a.i,(*p).i并且p->i都是一样的.
这.是一个"直接选择器",->是一个"间接选择器".
好吧,我也必须添加一些东西。结构与数组有点不同,因为数组是指针而结构不是。所以要小心!
假设我写了这段无用的代码:
#include <stdio.h>
typedef struct{
int km;
int kph;
int kg;
} car;
int main(void){
car audi = {12000, 230, 760};
car *ptr = &audi;
}
Run Code Online (Sandbox Code Playgroud)
这里的指针ptr指向结构变量的地址(!),audi但在地址结构旁边还有一个数据块(!)!数据块的第一个成员与结构本身具有相同的地址,您可以通过仅取消引用这样的指针*ptr (无大括号)来获取它的数据。
但是如果你想访问除第一个成员之外的任何其他成员,你必须添加一个像.km,的指示符.kph,.kg它们只不过是数据块基地址的偏移量......
但是由于优先级,您不能编写*ptr.kg访问运算符.在取消引用运算符之前进行评估,*并且您会得到*(ptr.kg)这是不可能的,因为指针没有成员!编译器知道这一点,因此会发出错误,例如:
error: ‘ptr’ is a pointer; did you mean to use ‘->’?
printf("%d\n", *ptr.km);
Run Code Online (Sandbox Code Playgroud)
相反,您使用它(*ptr).kg并强制编译器第一次取消引用指针并启用对数据块的访问,第二次添加偏移量(指示符)以选择成员。
检查我制作的这张图片:
但是如果你有嵌套成员,这种语法将变得不可读,因此->被引入。我认为可读性是使用它的唯一正当理由,因为它ptr->kg比(*ptr).kg.
现在让我们换一种方式来写,以便您更清楚地看到这种联系。(*ptr).kg? (*&audi).kg? audi.kg. 在这里,我第一次使用的事实,ptr是一个“地址audi”,即&audi与事实“引用” &和“解引用” *运营商取消了海誓山盟。