Указатели первые, новые и временные нулевые указатели? - PullRequest
0 голосов
/ 15 января 2019

Я начинающий. Итак, мне сложно понять связанные списки и поведение указателей при создании первого или последнего элемента и т. Д. Вскоре после создания структуры new_type (student) (с указателем на себя) и объекта этой структуры существует три указателя. «первый», «новый» и «временный». Они всегда являются нулевыми указателями (включая указатель ссылки)? Я имею в виду, как только они будут объявлены, я понимаю, что позже они должны изменить адрес и / или стоимость. Если (! Ptr) команда говорит, что они есть. Если это всегда так, я мог бы лучше понять принцип дальнейшего кода. Во всех уроках и лекциях этот указатель должен быть объявлен как нулевой указатель, чтобы стать таковым. Tnx.

#include <iostream>
using namespace std;

typedef struct student { 
    char* first_name;
    char* last_name;
    char* smth;
    student* link; // is this null pointer??
}student;

student* first, *new;   //
student* temp;          // are these null pointers?  

// here is whole thing... pointers "translated"
#include <iostream>
#pragma GCC diagnostic ignored "-Wwrite-strings"

using namespace std;

typedef struct student {
    char* name;
    char* last_name;
    char* rnmb;
    student* next;
} student;

student *poc, *s;
student *temp;     

void make_new (char name[10], char last_name[10], char rnmb[5]){ 
    s = new student;
    s->name = name; 
    s->last_name = last_name;
    s->rnmb = rnmb;
    s->next = NULL; 
}

void add_at_b (char name[10], char last_name[10], char rnmb[5]) {
    make_new (name, last_name, rnmb);
    s->next = poc; 
    poc = s;
    }   

void add_at_end (char name[10], char last_name[10], char rnmb[5]) {
    make_new (name, last_name, rnmb);
    if (!poc) {
        poc = s;
    } else {
        temp = poc;
        while  (temp->next) temp = temp->next;
        temp->next = s;
    }
}

void stu_del (char name[10]) {
    temp = poc;
    while (temp->next) {
        if (temp->next->name == name) {
            delete temp->next;
            temp->next = temp->next->next;
        }
        temp = temp->next;
    }
}


void stu_del_all () {
    student *cpy;
    temp = poc;
    while (temp) {
        cpy=temp;
        temp=temp->next;
        delete cpy;
    }
    poc = NULL;
}

int main()
{
    add_at_b("John", "Doe", "4323");
    add_at_end("John jr.", "DoeII", "4323");
    add_at_b("Ma", "Mar", "4323");
    stu_del("John");
    //stu_del_all ();
    if (poc == NULL) cout << "List is empty" << endl;
   return 0;
}

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Кажется, что эти переменные объявлены в глобальном пространстве имен (т.е. вне функции), и в этом случае да: они инициализируются как nullptr.

Однако, если бы они были объявлены внутри функции, это было бы не так, и вам нужно было бы явно написать:

student* first = nullptr;

Ничто не мешает вам написать это там, где они есть.

link - это , а не nullptr, потому что link - это ничто. link еще не существует, потому что все, что у вас есть, это указатели на ничто.

У вас есть некоторые плохие практики здесь (using namespace std;, typedef struct), поэтому вы можете просто изменить свой код следующим образом:

struct student
{
    std::string first_name;
    std::string last_name;
    student* link = nullptr;
};
0 голосов
/ 15 января 2019
typedef struct student { 
    char* first_name;
    char* last_name;
    char* smth;
    student* link; // is this null pointer??
}student;

Это объявление переменной-члена. Нет указателя link, пока не будет создан объект student.

student* first, *new;   //
student* temp;          // are these null pointers?  

Переменные со статической продолжительностью хранения инициализируются нулями (до дальнейшей инициализации, если таковые имеются). Поэтому изначально это нулевые указатели. За исключением new, который является ключевым словом и, следовательно, неправильно сформированным именем переменной.

есть три указателя. «первый», «новый» и «временный». Они всегда нулевые указатели

Зависит от того, как вы инициализировали объект student. Существует множество различных синтаксисов, которые можно использовать для инициализации объекта.

Если вы инициализировали его по умолчанию, то он не обязательно будет нулевым - инициализированные указатели по умолчанию имеют неопределенное значение. Если объект не имеет статической памяти, в этом случае он инициализируется нулями, как я упоминал выше. Если вы прочитаете неопределенное значение, поведение программы будет неопределенным (применяются некоторые исключения).

Если у вас есть значение, инициализированное объектом, тогда указатель будет нулевым.

Если у вас есть список инициализированных объектов, то эти указатели будут иметь значения, которые вы указали в выражении инициализатора. Те элементы указателя, которые не имеют инициализатора, будут инициализированы значением и, следовательно, будут нулевыми.

0 голосов
/ 15 января 2019

Объекты встроенных типов, определенные в глобальной области видимости, инициализируются всеми нулями. Так что first, last и temp - все нулевые указатели.

link является частью определения типа. Код не создает никаких student объектов, поэтому нет указателей link, поэтому нет нулевых link указателей.

...