【发布时间】:2019-12-11 14:48:36
【问题描述】:
我试图了解指向结构对象的指针(其中包含指向相同类型的结构的指针)的初始化是如何发生的。例如我有一个struct:
struct node {
node *next;
};
假设我有一个内存池的起始地址,即内存池是一个指向起始位置的指针。 (为了争论,假设起始内存是1001。)
char* pool[65536];
现在我声明一个node 类型的指针,并通过reinterpret_cast 为其分配起始内存。
node* a =reinterpret_cast<node *>(pool);
当前a 指向内存1001。现在我声明另一个指针
node* b;
b=a;
现在发生的事情是b 指向与a 相同的地址,即1001。指针b->next 指向某个预期的随机位置,但指针b->next 的地址与b 指向的地址相同,即1001。即
&b->next = b
我不明白为什么b->next 的地址与b 指向的指针相同?根据我的理解b->next应该位于b所在的位置。
P.S:我试图找出这是如何发生的,但找不到相关文档。如果此类问题已在某些文档或其他问题中得到解答,请务必提供链接。
P.P.S:在和我的同事进一步讨论这个问题后,我发现b 是一个指针而不是一个对象。它指向一个位置(即1001),根据b,存在一个包含指针next的节点对象,因此b->next(&b->next)的地址与b 正在指向。
【问题讨论】:
-
node* a =1001;不会编译。 -
由于您专门使用了 C++17 标签,所以我删除了 C 标签。 C 和 C++ 是不同的语言,答案可能取决于此。如果您想询问C,请将C++标签更改为C标签。
-
为什么
b->next的地址与b指向的地址不同?在您看来,b->next还会位于何处?两者都是node*类型的事实无关紧要。考虑:struct S {int n;}; S s; std::cout << ( (void*)&s == (void*)&s.n );这将打印1 -
尝试随机的东西并不是学习 C++ 的好方法。
-
指针是一个很难且很长的话题。我建议通过指针上的 good C++ book 的 cahpter(s),然后看看是否能回答您的问题。需要的另一点信息是,对于标准布局类型(节点是什么),类的地址与其第一个成员的地址相同。