2014-10-21 1 views
0

Когда мы создаем массив целых чисел, мы делаем это так:Создание массива узлов

int main() { 
int x; 
cout << "Enter size of array" 
cin >> x; 
int* myArray; 
myArray = new int[x] 
} 

мы относим звездочки рядом с массивом, мы присваиваем его как массив указателей правого?

Если я делаю массив узлов, где:

struct Node { 
string Name; 
int Age; 
} 

Я побежал код, чтобы экспериментировать с ним и понять больше, и я пытался сделать так же, как образец массива, но создать массив с узлами.

int main() { 
Node* sumShit[5]; 
    Node* America = new Node(); 
    America->age = 16; 
    America->Name = "America"; 
    sumShit[0] = America; 
    Node* Japan = new Node(); 
    Japan->age = 15; 
    Japan->Name = "Japan"; 
    sumShit[1] = Japan; 

    cout << "[" << sumShit[1]->Name << ", " << sumShit[1]->age << "]"; 

} 

Все распечатаны в порядке с указателями, но я сделал это и без указателей, где я просто хранятся свойства узла в узле:

Node myNodeShit[5]; 
    Node Poop; 
    Poop.age = 16; 
    Poop.Name = "Poop"; 
    myNodeShit[0] = Poop; 
    sortArrayName(myNodeShit, 5); 
    printArray(myNodeShit, 5); 

И это тоже работали, однако WHATS преимущества в использовании указатели и просто хранить его в узле. Когда дело доходит до алгоритмов, сортировки и использования памяти, есть ли предпочтительный способ. Я пытаюсь понять, почему было бы лучше иметь его как массив указателей на узлы и массив узлов.

+0

Что касается того, почему использование указателей может быть лучше, чем массивы, подумайте о том, объявляете ли вы массив внутри функции и возвращаете указатель на этот массив, то это может привести к [* неопределенному поведению *] (http: // en .wikipedia.org/wiki/Undefined_behavior), когда массив выходит из области действия, когда функция возвращается, и указатель больше не действителен. Если вы выделили память с помощью 'new' внутри функции, а затем вернули этот указатель, то это будет нормально, так как память будет по-прежнему выделяться при возврате функции. –

+0

Обратите внимание на свой язык. – molbdnilo

+1

Любая причина, по которой вы не используете контейнеры STL? – DumbCoder

ответ

1

Использование указателей позволяет повысить гибкость при обновлении/изменении существующих данных, поскольку данные объявляются только один раз в памяти. Отсюда вы можете использовать указатели для внесения изменений в любом месте вашего кода.

Кроме того, использование указателей сохраняет память, тогда как создание фактических узлов сделает копии указанного узла. Это становится очевидным, когда вы передаете массив в функцию. В этом случае массив узлов (без указателей) становится локальной копией, помещенной в стек вызовов. Когда функция вернется, вы потеряете все изменения, внесенные вами в узел. И наоборот, использование указателей сохранит состояние узла.

Если вы сомневаетесь, попробуйте использовать указатели, где сможете.

+0

Спасибо, это было действительно ясно. Если есть сомнения, используйте указатели. – Karan

Смежные вопросы