无法弄清楚此示例中的指针逻辑

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-&gt;phone(*newOne).phone 的缩写。 *newOne 的意思是“地址为newOne 的东西”,所以它是我们刚刚创建的Entry(使用new Entry)。所以(*newOne).phoneEntry的成员叫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)

这是一个函数调用。我不确定你在这里问什么。

【讨论】:

谢谢,这对我来说应该足够了。在我正在做的事情上获得具体的帮助会很有帮助,而不是仅仅阅读更多的书并花费五倍的时间来获取信息。我已经读了好几个小时了。想为一件事提出问题并不是犯罪。谢谢。 实际上,函数调用让我有点困惑,但这还得等。我只是对进入该功能的内容以及所有这些工作的方式感到困惑。我不会急于解决这个问题,而是会感到满意,因为我现在开始对指针有感觉了。

以上是关于无法弄清楚此示例中的指针逻辑的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的函数返回指针

无法弄清楚如何解决在二叉树中返回两个总和为目标值的值的逻辑缺陷

反汇编中的引用类型和指针

无法计算 C++ 中的指针!需要有关基本字符串和指针的信息

空指针异常。无法弄清楚如何修复

如何从 char* 函数返回指针