Другие языки программирования и технологии

СЛОЖНА! С++ Начал читать про указатели. Скопилось куча вопросов. Помогите!

1) Выделяется ли память для указателя, при его объявлении ?
2) Какая разница где записывать звездочку " int* a; " or " int *a " or " int * a " ?
3) Если указатель это тоже переменная, то почему его адрес нельзя передать другому указателю?
4) К указателю можно присвоить тип void но ведь void ничего не занимает в памяти, а указатель может показать адрес, где он его хранит?
И добавьте примечания еще от себя.
Указатель – это переменная, которая хранит адрес первого байта объекта в памяти, после инициализации путём взятия адреса. Тип указателя и объекта должны совпадать. Нельзя использовать не инициализированный указатель. Если указателю в текущий момент времени невозможно присвоить адрес, то по стандарту C++11 ему присваивается значение nullptr типа std::nullptr_t. Под указатель выделяется память в стеке. Размер выделяемой памяти можно определить применив операцию sizeof. Размер выделяемой памяти зависит от платформы и не зависит от типа указателя. Над указателями возможны следующие операции: взятия адреса (описано выше), разыменования (получить значение, прямой доступ к объекту). По указателю можно получить косвенный доступ к объекту. С указателями можно использовать адресную арифметику (главным образом сложение и вычитание, где преимущественно используется инкремент/декремент, реже умножение, очень редко деление). Указатель на void может хранить адрес объекта любого типа, в дальнейшем, при использовании такого указателя необходимо применять явное приведение к реальному типу. Используется указатель на void для передачи аргументов в функцию, и в качестве возвращаемого из функции значения.

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

По указателю можно выделять память динамически в куче. Для этого используются операции new и new[]. После использования и до выхода из программы вся память, выделенная по таким указателям должна быть освобождена операциями delete и delete[].

Указатель может указывать на указатель. По указателю можно выделить память под массив указателей, как статический, так и динамический.
Вячеслав Фоменков
Вячеслав Фоменков
71 662
Лучший ответ
1. Память выделяется всегда) Указатель занимает меньше места, чем объект, поэтому его проще передавать. Размер же его зависит от компилятора.
2.Во избежание путаницы рекомендую писать ближе к переменной, а так без разницы, только вторая переменная будет уже просто целой а не указателем))
3.Можно, и это принципиальный момент! Косвенно-косвенная адресация, да тоже многомерный массивы так реализованы.
4. Опять не верно. См. п. 1.Память на указатель всё равно будет выделена, просто void это "неопределенного типа" указатель, за правильное приведение отвечает программист.
Ilya Perov
Ilya Perov
36 000
Можно создать указатель на указатель, но объявить его нужно int ** ptr;
1.Смотря как объявить. Сам указатель занимает память.
2.Без разницы.
3.Адрес указателя можно передать - только другой указатель уже будет указатель на указатель на тип.
4.void* - это адрес первого байта, но тип неизвестен, делается каст к нужному типу для того чтобы дать указание компилятору сколько байт информации прочитать.
Erik Baimbetov >>3.Адрес указателя можно передать
Оо...
int *a,b;
a = new int;
*a = 10;
b=a;
разве *b будет не 10?)
2) Этот мир поделен, на тех кто пишет звездочку к типу и на тех кто пишет к идентификатору.
Darius
Darius
4 654
Erik Baimbetov А можно мне сразу обе?)))
1) Да, на размер указателя, 4\8 байт зависит от архитектуры.
2) Понятия не имею
3) Кто вам сказал что нельзя? можно!!
4) Void это и есть указатель размером 4\8 байт.

Различия между Void и int* в том что Void указатель на любой тип памяти а int* только на число типа int*, int* помимо указателя содержит еще и размер хранимого типа.

по п2 есть предположение что int* a,b; - оба указатели, а в случае с int *a,b; только a указатель, но это чисто личное предположение
Ivan Bondarev >>int* a,b; - оба указатели
Нет, указатель только а.
b - это int.