在这个例子中无法弄清楚指针逻辑

时间:2016-01-20 03:35:50

标签: c++ pointers

我无法解决这个问题。这是一个链表示例。

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

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

我最终弄清楚的是,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;
}
  1. 条目* newOne =新条目 (我不明白这一点 - 不是新条目只是一个结构条目的地址吗?并且不是条目* newOne是指针吗?那么这不仅仅是分配值的指向地址的指针......很遗失。
  2. 如果newOne只是一个地址(它是在验证之后)那么为什么说newOne-&gt; phone = phone会做什么?这没有意义!

    1. 条目* GetNewEntry() (我不明白这一点 - 在函数结束时返回newOne条目的地址 - *添加到此&#34;或者返回&#34;值

    2. 条目* n = GetNewEntry() (关于具有指针符号的函数 - GetNewEntry要么返回newOne内存地址,要么返回newOne指针 - 然后将Entry * n作为struct Entry指针设置为该内存地址(很像Entry * newOne) = new entry)或者它将被设置为指向该地址的指针......呃)

    3. PrintEntry(n)引用PrintEntry(条目* e)

    4. 你可以看到我很困惑。

2 个答案:

答案 0 :(得分:0)

此代码中的第一件事:

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

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

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

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

现在,PrintEntry函数将打印刚刚创建的Entry中的数据。从我的观点来看,Entry结构中的“next”变量在这里没用,但是在你的课程中可能会有一个使用这个变量的LinkedList。

答案 1 :(得分:0)

  
      
  1. Entry *newOne = new Entry;(我不明白这一点 - 不是新条目只是一个结构条目的地址吗?并且不是条目* newOne一个指针?那么这不仅仅是分配值的指向地址的指针......很遗失。
  2.   

指针是保存地址的变量。 new Entry在堆上创建一个新的Entry,然后返回其地址。然后,此地址存储在newOne中。此行还声明了newOne,但它可以单独编写为Entry *newOne; newOne = new Entry;

  

如果newOne只是一个地址(它是在验证之后)那么为什么说newOne-&gt; phone = phone会做什么?这没有意义!

为什么不呢? newOne->phone(*newOne).phone的缩写。 *newOne表示“地址为newOne的内容”,因此它是我们刚刚创建的Entrynew Entry)。因此(*newOne).phoneEntry的成员phone

  
      
  1. Entry *GetNewEntry()(我不明白这一点 - 在函数的末尾返回了一个返回newOne条目的地址 - 也许*添加到这个“返回”值)
  2.   

Entry *是返回类型。它也可以写成Entry* GetNewEntry()。此函数返回指向Entry的指针(或Entry的地址;根据需要调用它)。类型中的*表示“指向”(或“地址”)之前的东西。

  
      
  1. Entry *n = GetNewEntry();(关于具有指针符号的函数 - GetNewEntry要么返回newOne内存地址,要么返回newOne指针 - 然后将Entry * n作为struct Entry指针设置为内存地址(很像Entry * newOne = new Entry)或者它将被设置为指向该地址的指针......呃)
  2.   

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

的返回值
  
      
  1. PrintEntry(n)返回PrintEntry(Entry * e)
  2.   

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