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[].
Указатель может указывать на указатель. По указателю можно выделить память под массив указателей, как статический, так и динамический.
Если указателю присвоить другой указатель, то они будут хранить один и тот же адрес, и указывать на один и тот же объект в памяти.
По указателю можно выделять память динамически в куче. Для этого используются операции new и new[]. После использования и до выхода из программы вся память, выделенная по таким указателям должна быть освобождена операциями delete и delete[].
Указатель может указывать на указатель. По указателю можно выделить память под массив указателей, как статический, так и динамический.
1. Память выделяется всегда) Указатель занимает меньше места, чем объект, поэтому его проще передавать. Размер же его зависит от компилятора.
2.Во избежание путаницы рекомендую писать ближе к переменной, а так без разницы, только вторая переменная будет уже просто целой а не указателем))
3.Можно, и это принципиальный момент! Косвенно-косвенная адресация, да тоже многомерный массивы так реализованы.
4. Опять не верно. См. п. 1.Память на указатель всё равно будет выделена, просто void это "неопределенного типа" указатель, за правильное приведение отвечает программист.
2.Во избежание путаницы рекомендую писать ближе к переменной, а так без разницы, только вторая переменная будет уже просто целой а не указателем))
3.Можно, и это принципиальный момент! Косвенно-косвенная адресация, да тоже многомерный массивы так реализованы.
4. Опять не верно. См. п. 1.Память на указатель всё равно будет выделена, просто void это "неопределенного типа" указатель, за правильное приведение отвечает программист.
Можно создать указатель на указатель, но объявить его нужно int ** ptr;
1.Смотря как объявить. Сам указатель занимает память.
2.Без разницы.
3.Адрес указателя можно передать - только другой указатель уже будет указатель на указатель на тип.
4.void* - это адрес первого байта, но тип неизвестен, делается каст к нужному типу для того чтобы дать указание компилятору сколько байт информации прочитать.
2.Без разницы.
3.Адрес указателя можно передать - только другой указатель уже будет указатель на указатель на тип.
4.void* - это адрес первого байта, но тип неизвестен, делается каст к нужному типу для того чтобы дать указание компилятору сколько байт информации прочитать.
2) Этот мир поделен, на тех кто пишет звездочку к типу и на тех кто пишет к идентификатору.


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 указатель, но это чисто личное предположение
2) Понятия не имею
3) Кто вам сказал что нельзя? можно!!
4) Void это и есть указатель размером 4\8 байт.
Различия между Void и int* в том что Void указатель на любой тип памяти а int* только на число типа int*, int* помимо указателя содержит еще и размер хранимого типа.
по п2 есть предположение что int* a,b; - оба указатели, а в случае с int *a,b; только a указатель, но это чисто личное предположение
Похожие вопросы
- Посоветуйте сайт для решения сложных задач по программированию, тоесть хочу научится решать сложные задачи, что читать?
- Пипец как мучает вопрос, помогите !
- пишу макрос в Excel, есть вопрос, помогите(2)
- Срочно!!! Не займет много времени!!! Ломаю голову над вопросом, Помогите!!! Программа. Pascal. Паскаль
- Два вопроса про указатели в С++ внутри.
- Вопрос про указатели в С++ внутри
- Список с использованием указателей на Си
- Вопрос по указателям и массива С++
- C++. Указатели. Связный список. Как добавить элемент в конец списка? Вопрос для разбирающихся
- Зачем нужны указатели в c++? начал изучать язык C++ и не очень понимаю зачем нужны указатели?
Оо...
int *a,b;
a = new int;
*a = 10;
b=a;
разве *b будет не 10?)