在C语言中同时使用箭头->和点.操作符

ktecyv1j  于 2023-02-21  发布在  其他
关注(0)|答案(6)|浏览(151)

我的印象是,通过同时使用箭头和点操作符,可以从链表或类似结构的子节点访问数据,如下所示:

typedef struct a{
int num;
struct a *left;
struct a *right;
}tree;

tree *sample;
...
if(sample->left.num > sample->right.num)
    //do something

但是当我尝试实现这个的时候,使用-〉和.从一个子节点访问数据,我得到了错误“请求非结构或联合体中的成员num”。

p5fdfcr1

p5fdfcr11#

指针使用->;对对象使用.
在你的特定情况下

if (sample->left->num > sample->right->num)

因为所有的samplesample->leftsample->right都是指针。
如果转换指向对象中的任何指针;使用.代替

struct a copyright;
copyright = *(sample->right);
// if (sample->left->num > copyright.num)
if (*(sample->left).num > copyright.num)
kwvwclae

kwvwclae2#

因为我没有看到它明确提到:

  • 使用-〉在指针左手 * 取消引用指针 *,并访问指针右侧的成员。
  • 使用.访问左手 * 变量 * 右侧的成员。
zqdjd7g9

zqdjd7g93#

sample-〉left给出了一个struct a*,不是struct a,所以我们要处理的是指针,所以你还是要用->.
但是,您可以使用sample->left->num

ut6juiuv

ut6juiuv4#

.用于访问结构(或联合)的成员,例如

struct S {
int x;
}

S test;
test.x;
  • 〉是编写(*pointer_to_struct).struct_member的较短方法
kkih6yb8

kkih6yb85#

sample->leftsample->right也是指针,因此您需要:

if (sample->left->num > sample->right->num) {
    // do something
}
3zwtqj6y

3zwtqj6y6#

我认为理解箭头和点的区别的一个简单方法是记住所有用点引用的东西都在栈上而箭头引用的东西都在堆上。
堆内存中的所有内容都是在程序运行时通过使用'new'关键字分配的,如下所示:

int* i = new int(100);

堆栈包含所有变量,这些变量的内存是在编译源代码时由编译器分配的,并且只能由创建它们的线程访问,它是程序预定义变量使用的“内置”内存,声明如下:

int i = 100;

我的想法是,堆栈变量的处理速度要快得多,但它们可用的内存量要有限得多,而堆可以根据需要分配尽可能多的内存,但与在堆栈上完成的计算相比,速度要慢得多。
堆栈很小,速度很快,并且在可用的总内存空间方面更有限,而您可以根据需要“将任何东西扔到堆上”。
关键是要记住箭头表示在堆上,点表示在堆栈上,这就是我在工作中正确使用它们所需要知道的。

相关问题