我的印象是,通过同时使用箭头和点操作符,可以从链表或类似结构的子节点访问数据,如下所示:
typedef struct a{ int num; struct a *left; struct a *right; }tree; tree *sample; ... if(sample->left.num > sample->right.num) //do something
但是当我尝试实现这个的时候,使用-〉和.从一个子节点访问数据,我得到了错误“请求非结构或联合体中的成员num”。
p5fdfcr11#
指针使用->;对对象使用.。在你的特定情况下
->
.
if (sample->left->num > sample->right->num)
因为所有的sample、sample->left和sample->right都是指针。如果转换指向对象中的任何指针;使用.代替
sample
sample->left
sample->right
struct a copyright; copyright = *(sample->right); // if (sample->left->num > copyright.num) if (*(sample->left).num > copyright.num)
kwvwclae2#
因为我没有看到它明确提到:
zqdjd7g93#
sample-〉left给出了一个struct a*,不是struct a,所以我们要处理的是指针,所以你还是要用->.但是,您可以使用sample->left->num。
struct a*
struct a
sample->left->num
ut6juiuv4#
.用于访问结构(或联合)的成员,例如
struct S { int x; } S test; test.x;
kkih6yb85#
sample->left和sample->right也是指针,因此您需要:
if (sample->left->num > sample->right->num) { // do something }
3zwtqj6y6#
我认为理解箭头和点的区别的一个简单方法是记住所有用点引用的东西都在栈上而箭头引用的东西都在堆上。堆内存中的所有内容都是在程序运行时通过使用'new'关键字分配的,如下所示:
int* i = new int(100);
堆栈包含所有变量,这些变量的内存是在编译源代码时由编译器分配的,并且只能由创建它们的线程访问,它是程序预定义变量使用的“内置”内存,声明如下:
int i = 100;
我的想法是,堆栈变量的处理速度要快得多,但它们可用的内存量要有限得多,而堆可以根据需要分配尽可能多的内存,但与在堆栈上完成的计算相比,速度要慢得多。堆栈很小,速度很快,并且在可用的总内存空间方面更有限,而您可以根据需要“将任何东西扔到堆上”。关键是要记住箭头表示在堆上,点表示在堆栈上,这就是我在工作中正确使用它们所需要知道的。
6条答案
按热度按时间p5fdfcr11#
指针使用
->
;对对象使用.
。在你的特定情况下
因为所有的
sample
、sample->left
和sample->right
都是指针。如果转换指向对象中的任何指针;使用
.
代替kwvwclae2#
因为我没有看到它明确提到:
zqdjd7g93#
sample-〉left给出了一个
struct a*
,不是struct a
,所以我们要处理的是指针,所以你还是要用->
.但是,您可以使用
sample->left->num
。ut6juiuv4#
.用于访问结构(或联合)的成员,例如
kkih6yb85#
sample->left
和sample->right
也是指针,因此您需要:3zwtqj6y6#
我认为理解箭头和点的区别的一个简单方法是记住所有用点引用的东西都在栈上而箭头引用的东西都在堆上。
堆内存中的所有内容都是在程序运行时通过使用'new'关键字分配的,如下所示:
堆栈包含所有变量,这些变量的内存是在编译源代码时由编译器分配的,并且只能由创建它们的线程访问,它是程序预定义变量使用的“内置”内存,声明如下:
我的想法是,堆栈变量的处理速度要快得多,但它们可用的内存量要有限得多,而堆可以根据需要分配尽可能多的内存,但与在堆栈上完成的计算相比,速度要慢得多。
堆栈很小,速度很快,并且在可用的总内存空间方面更有限,而您可以根据需要“将任何东西扔到堆上”。
关键是要记住箭头表示在堆上,点表示在堆栈上,这就是我在工作中正确使用它们所需要知道的。