2015-09-08 11 views
0

Я новичок, и этот вопрос меня всегда смущает. В моей учебной книге говорится, что новый оператор возвращает адрес. Но во многих учебниках я обнаружил, что новый возвращает указатель, указывающий на конкретный адрес. Отнесите:Что возвращает новый оператор?

char *name = new char[x]; 

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

+0

Обратите внимание, что «адрес» и «указатель» означают то же самое на языках C и C++ и не имеют никакого отношения к аппаратной идее адреса ячейки памяти за пределами того факта, что именно так компилятор их реализует , – Hurkyl

+1

Указатель - это переменная, способная хранить адрес. Адрес, возвращаемый 'new', сохраняется в указателе. Вот почему мы называем их * указателями *, потому что они указывают на адрес. – Galik

ответ

0

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

char *name = new char[x]; 
// name is a char pointer that contains the address to the first char from your char array 

name[0] обращается к первому элементу массива. name[1] обращается ко второму элементу массива.

1

Оператор new возвращает указатель в начало массива.

Указатель - это адрес некоторой ячейки памяти.

вот почему мы можем сказать: оператор new возвращает адрес в начало массива.


Извините за мой английский.

5

Указатель представляет собой переменную, содержащую адрес другой переменной. Таким образом, оба утверждения примерно одинаковы. Возвращается указатель, содержащий адрес.

Когда вы говорите, что указатель указывает на что-то, это означает, что он содержит свой адрес.

0

Результат выражения типа массива (например, new char[x]) является указателем (в данном случае типа char *). При использовании формы массива оператора new, как и вы, значение этого указателя является адресом первого элемента динамически распределенного массива. При использовании формы без массива (как в new char) выделяется один объект, а указатель имеет значение, равное адресу этого объекта.

Значение переменной name, присвоенное оператором char *name = new char[x], является значением указателя, заданного выражением new char [x].

Если во время выделения возникает ошибка, то оператор new выдает исключение, а не возвращает значение, а переменная name никогда не получает значение. [Это можно изменить, используя альтернативные формы оператора new, которые возвращают NULL при ошибке и не бросают, но вы этого не сделали].

0

Значение нового выражения new T[N] является адресом первого элемента динамически распределенного массива размером N из T. Тип этого значения: T *, то есть тип указателя такого адреса.

Сам объект массива обычно не адресуется, и вы вообще не можете назвать полный объект (на самом деле вы не можете даже сказать его тип).Вы можете назвать только каждый из его подобъектов, и вы можете уничтожить и освободить объект массива только по адресу его первого элемента.

0

Выражение

new char[x] 

выделяет массив char объектов, и возвращает указатель (типа char*) к объекту с индексом ноль.

Если вы хотите, чтобы динамически выделять указатель, можно использовать

new char* 

, которая динамически выделяет объект типа char*, и возвращается указатель (типа char**) к нему.