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

Can't figure out the pointer logic in this example

本文关键字:指针 弄清楚      更新时间:2023-10-16

我一辈子都想不通。这是一个链表示例。

我是初学者。我已经看了大约一个小时了,我准备折叠并寻求帮助。嘿。

所以基本上问题是其中一个函数上有一个指针,函数内部有一个指针,到处都是指针,我似乎无法弄清楚这里正在采取的一系列逻辑步骤。

我最终发现的是条目 *newOne 正在定义一个"结构条目"指针。我真的不明白完整语句中发生了什么,或者不同部分如何调用值。完全。

更多细节如下。

#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;
}
  1. 条目 *newOne = 新条目(我不明白这一点 - 新条目不就是结构条目的地址吗?条目 *newOne 不是指针吗?那么这不就是将指针的值分配给一个地址吗......很迷茫。
如果newOne

只是一个地址(它是经过验证的),那么为什么说newOne->phone=phone有什么作用呢?这说不通!

    条目
  1. *获取新条目()(我不明白这一点 - 在函数的末尾返回 newOne 条目的地址 - * 是否可能会添加到这个"返回"值)

  2. Entry
  3. *n = GetNewEntry()(关于具有指针符号的函数 - GetNewEntry 要么返回 newOne 内存地址,要么返回 newOne 指针 - 并且 Entry *n 是一个结构,然后条目指针将被设置为该内存地址(很像条目 *newOne = 新条目),或者它将设置为指向该地址的指针......呃)

  4. PrintEntry(
  5. n) 引用回 PrintEntry(Entry *e)

如您所见,我很困惑。

这段代码中的第一件事:

struct Entry {
string name, phone;
Entry *next;};

是可能的电话簿条目的链接列表。我希望您熟悉链表,否则请查看此处 http://www.cprogramming.com/tutorial/lesson15.html

如果你在main中跟踪代码,它非常简单。首先,它通过调用 GetNewEntry 函数创建一个条目。此函数提示用户输入姓名和电话号码等数据,并创建 Entry 对象。

它将结构中的"next"变量设置为 null,因为这可能是它将要创建的唯一元素,并将创建的对象返回给主函数。

现在,PrintEntry函数将打印刚刚创建的条目中的数据。从我的角度来看,Entry 结构中的"next"变量在这里是无用的,但也许在你的课程中会有一个利用这个变量的 LinkedList。

  1. Entry *newOne = new 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

  1. Entry *GetNewEntry()(我不明白这一点 - 在函数结束时返回 newOne 条目的地址 - * 是否可能会添加到这个"返回"值)

Entry *是返回类型。也可以写成Entry* GetNewEntry().此函数返回指向Entry的指针(或Entry的地址;随心所欲地称呼它)。 类型中的*表示"指向它前面的事物的指针"(或"地址")。

  1. Entry *n = GetNewEntry();(与具有指针符号的函数有关 - GetNewEntry 要么返回 newOne 内存地址,要么返回 newOne 指针 - 并且 Entry *n 是一个结构,然后条目指针将被设置为该内存地址(很像条目 *newOne = new Entry),或者它将设置为指向该地址的指针......呃)

这意味着与Entry *n; n = GetNewEntry();相同。它声明变量n(类型为 Entry*)。然后它调用GetNewEntry().然后,它将n设置为返回值 GetNewEntry()

    PrintEntry(
  1. n) 引用回 PrintEntry(Entry *e)

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