![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
NoviceF, как насчёт
??? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: нет Всего: 2 |
feodorv, NoviceF, понеслось из пустого в порожнее, это уже обсуждалось на первых страницах.
Bsa, да ты я смотрю любишь глумиться чтоле? это я по поводу закрытия темы, давно пора уж |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 8 Всего: 56 |
feodorv, а так писать не надо. Одна строка - одна инициализированная переменная.
|
|||
|
||||
baldina |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
maxi2,
ответьте на вопросы, что означает 1.
2.
3. (само по себе и в контексте объявления выше)
4.
5.
Как только ответите правильно, никакие выражения будут вам не страшны, т.к. являются комбинацией этих. например
можно рассматривать как *(*(*(*p))); а по отдельности вы знаете. больше никаких сложностей здесь нет, вы сами себе все усложняете |
||||||||||||
|
|||||||||||||
nubliK |
|
|||
![]() вселенские матрицы Профиль Группа: Участник Сообщений: 36 Регистрация: 11.9.2008 Где: Владивосток Репутация: нет Всего: нет |
Попробую объяснить для maxi2 как все работает. Приведу такой код, желательно чтобы maxi2 скомпилировал его и посмотрел что получается.
Теперь по порядку: 1 - память в компьютере представляет из себя плоскую модель, сделано это для простоты, при этом как на самом деле устроенная физически память нас мало интересует. что есть плоская модель? - это когда у тебя конкретное содержимое ячейки памяти соответствует одному и только одному собственному адресу. Адрес и ячейка памяти это две большие разницы и хранятся они по разному. 2 - что такое ссылка? это адрес памяти в которой что то хранится (переменная, класс, функция и т.д.), НО везде пишется что это ссылка ссылается на адрес чего то. Ссылка записывается так &ЧТОТО, под ЧТОТО - понимается переменная, то есть вот это "ЧТОТО" - это есть псевдоним переменной, а запись &ЧТОТО - это есть ссылка на то самое ЧТОТО, то есть уже не псевдоним а конкретно на значение. Вот память: | тут адреса | тут значения | |----------------|-------------------| |адрес №1 | ЧТОТО | |----------------|-------------------| |адрес № 2 | ЧТОТОЕЩЕ | и так далее от начала до конца (памяти для программы, не физической памяти). Конструкция &ЧТОТО - в памяти компьютера хранится как адрес и занимает в этой памяти (на процессорах х86) 4 байта. 3 - что такое указатель? - это переменная хранящая адрес другой переменной в памяти. Почему указатель тоже переменная? потому что с ним тоже можно производить арифметические операции. Что физически представляет конструкция например int * p = &p - читается как указатель на переменную типа ИНТ, само выражение называется "РАЗЫМЕНОВАНИЕМ" то есть - есть ссылка в памяти представленная как &p и есть указатель на какую то ссылку int * p, когда компилятор встречает такое &p он говорит что "я линкёру передам адрес переменной p" при этом память под хранение ссылки &p не выделится а будет связь между переменной p и ее адресом &, далее компилятор встречает вот это int *p и что он делает? он говорит операционной системе, "выдели пожалуйста память для хранения адреса какой то переменной (пока мы не знаем какой) но переменная будет типа ИНТ". Далее компилятор читает выражение дальше и встречает оператор присваивания =, (наше выражение приобретает вид int * p = &p) и говорит - "линкёр, линкёр свяжи ссылку типа переменной p типа ИНТ с выделенным адресом под указатель типа инт". После этой операции с *p - можно обращаться как с переменной p без зазрения совести. И называться *p будет указателем на p типа ИНТ. Это сложно понять с первого раза, причем всем. В нашем случае важна другая суть. Суть в том что указатель на переменную дает возможность работать с этой переменной на прямую не делая копию этой переменной. Указатели можно складывать, умножать, вычетать и т.д. С ссылкой так делать нельзя. Потому что - что значит прибавить к ссылке например еденицу, это значит опуститься по памяти на одну ячейку и в этом случае ссылка вернет уже что то другое, а не значение нашей переменной. Различия между С++ и С: в си ссылочная арифметика вызовет предупреждение, в си плюс плюс такая арифметика вызовет ошибку. (а может я не прав? поправьте меня если где то ошибся) ![]() Для maxi2 попробуй прибавить еденицу в програме выше к указателю и к ссылке и выведи себе результат в консоль. поэксперементируй. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
||||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Вы уже не обьясняйте о указателях. Вот двойной это действительно непонятно пока что. Ведь в примере где x=1, *y, **z, ***k все они если втыкнуть в СИ-аут будут равны 1. То что **р=*(*p) я и сам спрашивал. По ходу понял что синтаксис обьявиение синтаксиса как раз не искусственный ибо int *p=&х-надо воспринимать как int* p=&х; тогда станет понятно почему указатель p равен адресу переменной как должно быть. Тут дело в том что int *p воспринимается как значение что есть в указателе то есть его разименование. То есть например если мы обьявим переменную int х=5; и если есть такой адрес памяти с таким адресом памяти как 0х5 то вызов значение в таком адресе если оно есть *х (например 2500) при присваивание его другой переменой int y=*х или cout<<*х вызовет ошибку ибо в таком случае надо было х обьявлять с типом int*. Если так то действительно это было ошибкой с моей стороны.
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
nubliK |
|
|||
![]() вселенские матрицы Профиль Группа: Участник Сообщений: 36 Регистрация: 11.9.2008 Где: Владивосток Репутация: нет Всего: нет |
Что есть в указателе то есть значение переменной по адресу. Типы данных должны соответствовать друг другу. Компилятор не знает других типов кроме примитивных, а как обращаться с типами вне стандартного набора, компилятору надо объяснять. |
|||
|
||||
nubliK |
|
|||
![]() вселенские матрицы Профиль Группа: Участник Сообщений: 36 Регистрация: 11.9.2008 Где: Владивосток Репутация: нет Всего: нет |
Пример от baldina тоже простой
А что тут сложного maxi2? По аналогии int x = 1; инициализация переменной &x - ссылка на переменную x int *px указатель на х &px - ссылка на ячейку где хранится адрес переменной x **ppx - указатель указателя на х и т.д. |
|||
|
||||
maxi2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 8.5.2012 Репутация: 1 Всего: 1 |
Да и с логикой двойных и более указателей разобрался. То есть от указателя верхнего уровня идет разименование к указателям с меньшим числом звездочек. Но как там быть с трехмерном масивом как под него выделять память с помощью указателей. Было однажды у меня такое задание. А в нете какого то примера именно с учебников нету. Только вот такое обьявиение конструктора не совсем понятно : Student (char* name="popov"). Ну тогда name это ведь адрес переменной сивольного типа? Ведь скорее мы на примере целоч. типа мы б имели char x="popov"; char* name=&x; 2. Чтобы не создавать новые темы задам здесь два микровопроса по C++: 1)есть ли разница в быстродействие между пре- и пост-инкрементом(один из вариантов был что пре-и. есть быстрее или тот же сам по скорости)2. Потом был у меня тест о S tack и heap-памяти: то наиболее подходящий вариант звучал как то что стек память касается локальных переменных, а Хип-выделение динамической памяти. Соответствует ли это действительности, ибо иные варианты были вообще никудышние.
|
|||
|
||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Так же, как и 2х мерным. Каждый уровень указателя требует вложенного цикла и new в нем:
Это описание значения по умолчанию. Если вы напишите Student(), то реально будет вызвано Student("popov") Не только. В языке С (и С++) указатель может указывать как на отдельную переменную, так и на массив (что иногда приводит к путанице). В данном случае указатель используется в смысле указателя на массив символов. В "popov" - это и есть массив символов (так устроены строковые константы в С) Если речь идет именно о переменных, то да. |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |