С++ что такое "pointer = new type" в качестве противопоставления "pointer = new type []"?

во многих турзаменах первые примеры кода о динамической памяти начинаются по строкам:

int * pointer;
pointer = new int;        // version 1
//OR
pointer = new int [20]    // version 2

они всегда начинают объяснять, как работает вторая версия, но полностью избегайте говорить о первой версии.

что я хочу знать, что создает pointer = new int? что я могу с этим сделать? что это значит? В каждом учебном пособии обязательно расскажу о первой версии полностью. Все, что я узнал (через messing about), следующее:

#include <iostream>

using namespace std;

int main()
{
    int * pointer;
    pointer = new int;
   pointer[2] = 1932;   // pointer [2] exists? and i can  assign to it?!
   cout << pointer[2] << endl;      // ... and access it succesfuly?!
};

Тот факт, что я могу индексировать pointer, говорит мне до сих пор, что я pointer = new int неявно создает массив. но если да, то какой размер?

Если бы кто-то помог мне все это очистить, я был бы великолепен...

Ответ 1

Это типичная ошибка для C и С++ для начинающих. Первое предложение создает пространство для размещения только int. Второй создает пространство для хранения 20 из этих int s. В обоих случаях, однако, он присваивает адрес начала динамически зарезервированной области переменной pointer.

Чтобы добавить к путанице, вы можете получить доступ к указателям с индексами (по мере того, как вы помещаете pointer[2]), даже если указана память, которую они указывают, недопустима. В случае:

int* pointer = new int;

вы можете получить доступ к pointer[2], но у вас будет поведение undefined. Обратите внимание, что вам нужно проверить, что эти обращения на самом деле не происходят, и компилятор обычно может делать это в случае предотвращения такого типа ошибок.

Ответ 2

Это создает только одно целое число.

pointer = new int;        // version 1

Это создает 20 целых чисел.

pointer = new int [20]    // version 2

Ниже указано недопустимое значение, поскольку указатель [2] переводится как * (указатель + 2); который не был создан/выделен.

int main()
{
    int * pointer;
    pointer = new int;
   pointer[2] = 1932;   // pointer [2] exists? and i can  assign to it?!
   cout << pointer[2] << endl;      // ... and access it succesfuly?!
};

Ура!

Ответ 3

Мой учитель объяснил это так. Подумайте о кино. Фактические места - это распределения памяти, а билет, который вы получаете, является указателем.

int * pointer = new int;

Это будет кинотеатр с одним местом, и указатель будет билетом на это место.

pointer = new int [20] 

Это будет кинотеатр на 20 мест, а указатель будет билетом на первое место. указатель [1] будет билетом на второе место, а указатель [19] будет билетом на последнее место.

Когда вы выполняете int* pointer = new int; и затем получаете доступ к pointer[2], вы позволяете кому-то сидеть в проходе, то есть undefined поведение

Ответ 4

new int[20] выделяет память для целого массива размером 20 и возвращает указатель на него.

new int просто выделяет память для одного целого числа и возвращает указатель на него. Неявно, это то же самое, что и new int[1].

Вы можете разыменовать (т.е. использовать *p) для обоих указателей, но вы должны использовать p[i] для указателя, возвращаемого new int[20].

p[0] будет по-прежнему работать на обоих, но вы можете ошибаться и ошибочно вводить неверный индекс.

Обновить. Еще одно отличие состоит в том, что для массива необходимо использовать delete[] и delete для целого числа.

Ответ 5

pointer = new int выделяет достаточно памяти в куче, чтобы сохранить один int.

pointer = new int [20] выделяет память для хранения 20 int s.

Оба вызова возвращают указатель на вновь выделенную память.

Примечание. Не полагайтесь на инициализированную выделенную память, она может содержать случайные значения.

Ответ 6

pointer = new int; выделяет целое число и сохраняет его адрес в pointer. pointer[2] является синонимом pointer + 2. Чтобы понять это, прочитайте об арифметике указателя. Эта строка на самом деле является undefined поведением, потому что вы получаете доступ к памяти, которую вы ранее не выделяли, и она работает, потому что вам повезло.

Ответ 7

* "Тот факт, что я могу индексировать указатель, говорит мне до сих пор, что я pointer = new int неявно создает массив, но если да, то какой размер он?" *

Это была часть вопроса, который мне больше всего понравился, и который вы подчеркиваете.

Как мы все знаем, динамическое распределение памяти использует пространство в стеке, которое относится к данной программе. Когда мы более подробно рассмотрим определение нового оператора: -

void* operator new[] (std::size_t size) throw (std::bad_alloc);

Это фактически представляет массив объектов этого конкретного размера, и если это успешно, то он автоматически Создает каждый из объектов в массиве. Таким образом, мы можем использовать объекты в пределах размера, потому что они уже инициализированы/построены.

int * pointer = new int;

С другой стороны, для приведенного выше примера есть всякая возможность поведения undefined, когда любой из

*(pointer + k) or *(k + pointer)

. Хотя доступ к определенной ячейке памяти можно получить с помощью указателей, нет никакой гарантии, потому что конкретный объект для нее не был создан и не сконструирован. Это можно рассматривать как пространство, которое не было выделено в стеке для конкретной программы.

Надеюсь, это поможет.

Ответ 8

int* p = new int выделяет память для одного целого. Это не приводит к созданию массива. То, как вы обращаетесь к указателю с помощью p[2], приведет к поведению undefined при записи в недопустимую ячейку памяти. Вы можете создать массив, только если вы используете синтаксис new[]. В таком случае вам нужно освободить память, используя delete[]. Если вы выделили память с помощью new, значит, вы создаете один объект, и вам нужно освободить память с помощью delete.

Ответ 9

Он не создает массив. Он создает единственное целое число и возвращает указатель на это целое число. Когда вы пишете указатель [2], вы ссылаетесь на память, которую вы не выделили. Вы должны быть осторожны и не делать этого. Эта память может быть отредактирована из внешней программы, которую вы, я верю, не хочу.

Ответ 10

int * pointer; pointer = new int;  // version 1
//OR 
pointer = new int [20]             // version 2 

что я хочу знать, что создает pointer = new int? что я могу с этим сделать? что это значит? В каждом учебном пособии обязательно расскажу о первой версии полностью

Причина, по которой учебник не отвлекает вас от того, что с ним делать, заключается в том, что он действительно абсолютно бесполезен! Он выделяет один int и дает вам указатель на это.

Проблема в том, что если вам нужен int, почему бы вам просто не объявить его?

int i;