无法弄清楚此示例中的指针逻辑
Posted
技术标签:
【中文标题】无法弄清楚此示例中的指针逻辑【英文标题】:Can't figure out the pointer logic in this example 【发布时间】:2016-01-20 03:35:50 【问题描述】:我这辈子都想不通。这是一个链表示例。
我是初学者。我已经看了大约一个小时,我准备折叠并寻求帮助。呵呵。
所以基本上问题在于其中一个函数上有一个指针,函数内部有指针,而且指针到处都是血腥的,我似乎无法弄清楚这里正在采取的一系列逻辑步骤。
我最终发现Entry *newOne 定义了一个“struct Entry”指针。我真的不明白完整声明中发生了什么,或者不同部分如何调用值。完全没有。
下面有更多细节。
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
struct Entry
string name, phone;
Entry *next;
;
void PrintEntry(Entry *e)
cout << e->name << " " << e->phone << endl;
Entry *GetNewEntry()
Entry *newOne = new Entry;
cout << "Enter name (ENTER to quit):";
string name;
getline (cin,name);
if (name == "") return NULL;
newOne->name = name;
cout << "Enter phone: ";
string phone;
getline(cin, phone);
newOne->phone = phone;
newOne->next = NULL; // no one follows
return newOne;
int main ()
Entry *n = GetNewEntry();
PrintEntry(n);
return 0;
-
条目 *newOne = 新条目
(我不明白这一点 - new Entry 不只是一个 struct Entry 的地址吗?Entry *newOne 不是一个指针吗?那么这不只是将指针的值分配给一个地址......相当迷路了。
如果 newOne 只是一个地址(在验证之后),那么为什么说 newOne->phone=phone 会做任何事情呢?这没有意义!
条目 *GetNewEntry() (我不明白这一点 - 在函数的末尾返回 newOne 条目的地址 - * 是否可能添加到这个“返回”值)
条目 *n = GetNewEntry() (与上面有指针符号的函数有关 - GetNewEntry 要么返回 newOne 内存地址,要么返回 newOne 指针 - 并且 Entry *n 作为结构 Entry 指针然后将被设置为该内存地址(很像 Entry *newOne = 新条目),否则它会被设置为指向该地址的指针...呃)
PrintEntry(n) 指回 PrintEntry(Entry *e)
如你所见,我很困惑。
【问题讨论】:
从here 挑选一本好书,了解指针及其工作原理。if (name == "") return NULL;
内存泄漏!!在这种情况下,您不要删除newOne
。
那么问题是什么?
我在代码后面的底部添加了一些具体的问题。我只是对这里使用指针的方式感到困惑。
“那这不就是把指针的值赋值给一个地址吗”——“地址”和“指针值”的意思是一样的。
【参考方案1】:
这段代码的第一件事:
struct Entry
string name, phone;
Entry *next;;
是可能的电话簿条目的链接列表。我希望您熟悉链表,否则请查看此处http://www.cprogramming.com/tutorial/lesson15.html
如果您在 main 中跟踪代码,则非常简单。首先,它通过调用 GetNewEntry 函数创建一个条目。此函数提示用户输入姓名和电话号码等数据并创建 Entry 对象。
它将结构中的“next”变量设置为空,因为这可能是它要创建的唯一元素并将创建的对象返回给主函数。
现在 PrintEntry 函数将打印刚刚创建的条目中的数据。从我的角度来看,Entry 结构中的“下一个”变量在这里是没用的,但也许在你的课程中会有一个使用这个变量的 LinkedList。
【讨论】:
【参考方案2】:@ 987654321@ (我不明白这一点 - new Entry 不只是一个 struct Entry 的地址吗?Entry *newOne 不是一个指针吗?那么这不只是将指针的值分配给一个地址。 .. 迷路了。
指针是一个保存地址的变量。 new Entry
在堆上创建一个新的Entry
,然后返回它的地址。然后这个地址存储在newOne
。这一行也声明了newOne
,但它可以单独写成Entry *newOne;
newOne = new Entry;
。
如果 newOne 只是一个地址(在验证之后),那么为什么说 newOne->phone=phone 会做任何事情呢?这没有意义!
为什么不呢? newOne->phone
是 (*newOne).phone
的缩写。 *newOne
的意思是“地址为newOne
的东西”,所以它是我们刚刚创建的Entry
(使用new Entry
)。所以(*newOne).phone
是Entry
的成员叫phone
。
Entry *GetNewEntry()
(我不明白这一点 - 在函数的末尾返回 newOne 条目的地址 - * 是否可能会添加到这个“返回”值)
Entry *
是返回类型。它也可以写成Entry* GetNewEntry()
。该函数返回一个指向Entry
的指针(或Entry
的地址;您可以随意调用它)。类型中的*
表示“指向”(或“地址”)之前的事物。
Entry *n = GetNewEntry();
(与上面有指针符号的函数有关 - GetNewEntry 要么返回 newOne 内存地址,要么返回 newOne 指针 - 然后 Entry *n 作为结构入口指针将被设置为该内存地址(很像条目 *newOne = 新条目),否则它将被设置为指向该地址的指针...呃)
这意味着与Entry *n;
n = GetNewEntry();
相同。它声明了变量n
(类型为Entry*
)。然后它调用GetNewEntry()
。然后将n
设置为GetNewEntry()
的返回值
PrintEntry(n) 指回 PrintEntry(Entry *e)
这是一个函数调用。我不确定你在这里问什么。
【讨论】:
谢谢,这对我来说应该足够了。在我正在做的事情上获得具体的帮助会很有帮助,而不是仅仅阅读更多的书并花费五倍的时间来获取信息。我已经读了好几个小时了。想为一件事提出问题并不是犯罪。谢谢。 实际上,函数调用让我有点困惑,但这还得等。我只是对进入该功能的内容以及所有这些工作的方式感到困惑。我不会急于解决这个问题,而是会感到满意,因为我现在开始对指针有感觉了。以上是关于无法弄清楚此示例中的指针逻辑的主要内容,如果未能解决你的问题,请参考以下文章