Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/56: Рейтинг темы: голосов - 56, средняя оценка - 4.66
25 / 25 / 19
Регистрация: 13.07.2015
Сообщений: 433

Указатели в с++ указывают только на адрес?

25.08.2015, 23:39. Показов 13914. Ответов 213
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Например указатель int *p; Он может инициализироваться только адресом?(и ничем другим) например *p=&s
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2015, 23:39
Ответы с готовыми решениями:

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

Указатели, адрес переменной
int main(коллеги!) Снова прошу меня поправить! Есть такой пример: int *ptr; // переменная - ptr, указывает на - int...

Указатели и ссылки. Как сохранить адрес?
Небольшая путаница с указателями и ссылками. Допустим,есть некий указатель p1, который указывает на экземпляр класса a1 в динамической...

213
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.08.2015, 21:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от castaway Посмотреть сообщение
Не факт что там есть этот объект. Но я на примере (не в Windows) могу его там создать. Я с таким же успехом могу выбрать абсолютно любое случайное значение указателя и это не будет означать что объект по этому адресу есть.
Хорошо, меняем пример:

Car *a = null;

Что в переменной? И только не говори что ты можешь что-то там создать, ситуация такая ты читаешь чужой код и наткнулся на эту строчку. Твои мысли, что внутри?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.08.2015, 21:30
Цитата Сообщение от AncientPenguin Посмотреть сообщение
Что в переменной?
В переменной 0. Если конечно под null ты подразумеваешь NULL или nullptr.

Добавлено через 1 минуту
AncientPenguin, при чём тут чужой код? Тут люди утверждают что в нулевом указателе не адрес, а я это опровергаю.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.08.2015, 21:31
Цитата Сообщение от ct0r Посмотреть сообщение
Ну то есть value, которое там в них может быть (например, как вариант адрес) - тоже на усмотрение производителя?
да.
есть такое понятие...
не знаю, как точнее сказать на русском: "представление данных".
что оно из себя представляет на самом деле: тупо цыферки,
которые означают адрес чего то там,
или смещение чего то там,
или что-то ещё - это на усмотрение производителя.


пользователя это не парит.
пользователя парит только профит,
который он может поиметь согласно правилам языка.

Цитата Сообщение от ct0r Посмотреть сообщение
Это некорректный пример. Про int явно написано, что там может быть.
ну возьмите какой нибудь другой тип.
это не принципиально.

Цитата Сообщение от ct0r Посмотреть сообщение
Окей. Вот тут &MyClass::foo (виртуальная функция) - адрес чего мы получили?
адрес функции-члена.

Цитата Сообщение от ct0r Посмотреть сообщение
Ага, только без obj король-то голый.
ну и что?
есть определенные правила для определенных случаев.
от этого адрес адресом быть не перестает.
0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.08.2015, 21:39
Цитата Сообщение от castaway Посмотреть сообщение
В переменной 0. Если конечно под null ты подразумеваешь NULL или nullptr.
Не может такого быть. Указатель типа Car, никакого значения 0 там не может быть. Так же там точно нет объекта по адресу 0, следовательно что там есть? Ничего там нет, а цифра 0 там просто потому что ничего физически нельзя положить в переменную, поэтому принимают что нулевой адрес это ничего.

Цитата Сообщение от castaway Посмотреть сообщение
AncientPenguin, при чём тут чужой код? Тут люди утверждают что в нулевом указателе не адрес, а я это опровергаю.
Вполне можно создать объект по нулевому адресу (ну в своей ОС с блекджеком...), но в С++ null это специальный маркер обозначающий пустоту. Как по другому можно обозначить ничего? Если бы null = 5 это бы что-то поменяло?
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
27.08.2015, 21:44
castaway,
The Prime 50 series used segment 07777, offset 0 for the null pointer, at least for PL/I. Later models used segment 0, offset 0 for null pointers in C, necessitating new instructions such as TCNP (Test C Null Pointer), evidently as a sop to [footnote] all the extant poorly-written C code which made incorrect assumptions. Older, word-addressed Prime machines were also notorious for requiring larger byte pointers (char *'s) than word pointers (int *'s).

The Eclipse MV series from Data General has three architecturally supported pointer formats (word, byte, and bit pointers), two of which are used by C compilers: byte pointers for char * and void *, and word pointers for everything else. For historical reasons during the evolution of the 32-bit MV line from the 16-bit Nova line, word pointers and byte pointers had the offset, indirection, and ring protection bits in different places in the word. Passing a mismatched pointer format to a function resulted in protection faults. Eventually, the MV C compiler added many compatibility options to try to deal with code that had pointer type mismatch errors.

Some Honeywell-Bull mainframes use the bit pattern 06000 for (internal) null pointers.

The CDC Cyber 180 Series has 48-bit pointers consisting of a ring, segment, and offset. Most users (in ring 11) have null pointers of 0xB00000000000. It was common on old CDC ones-complement machines to use an all-one-bits word as a special flag for all kinds of data, including invalid addresses.

The old HP 3000 series uses a different addressing scheme for byte addresses than for word addresses; like several of the machines above it therefore uses different representations for char * and void * pointers than for other pointers.

The Symbolics Lisp Machine, a tagged architecture, does not even have conventional numeric pointers; it uses the pair <NIL, 0> (basically a nonexistent <object, offset> handle) as a C null pointer.

Depending on the memory model' in use, 8086-family processors (PC compatibles) may use 16-bit data pointers and 32-bit function pointers, or vice versa.

Some 64-bit Cray machines represent int * in the lower 48 bits of a word; char * additionally uses some of the upper 16 bits to indicate a byte address within a word.
Цитата Сообщение от castaway Посмотреть сообщение
Если я скомпилирую программу компилятором GCC 5.1.0 (MinGW) по канонам стандарта C++11 и успешно прочитаю/запишу данные по нулевому указателю, то это будет доказывать что дело не в переносимости и что в нулевом указателе, который можно разименовать, адрес всегда равен нулю?
А как ты собрался читать/писать?

Цитата Сообщение от hoggy Посмотреть сообщение
адрес функции-члена.
Ну скажем, вернулось нам число 1. Берем &OtherClass::field (данные). Тоже вернуло 1. Это понимать, что адреса у виртуальной функции и поля одинаковые, значит они указывают на одну и ту же область данных, или как?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.08.2015, 21:50
Цитата Сообщение от castaway Посмотреть сообщение
В переменной 0.
Цитата Сообщение от AncientPenguin Посмотреть сообщение
Не может такого быть.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
struct Car {
    Car() { std::cout << "ctor\n"; }
};
 
int main()
{
    Car * car = nullptr; // в данном случае переменная - это car, которая содержит адрес 0
    std::cout << car << std::endl; // 0
}


AncientPenguin, "ничего" в указателях не бывает.

Добавлено через 3 минуты
ct0r, большая цитата мне ни о чем не говорит.

Цитата Сообщение от ct0r Посмотреть сообщение
А как ты собрался читать/писать?
C++
1
2
3
4
5
6
7
8
9
10
    unsigned short * p = 0;
 
    // пишу
    *p = 0x1234; // так
    p[0] = 0x1234; // или так
 
    // читаю
    unsigned short v;
    v = *p; // так
    v = p[0]; // или так
Тип не имеет значения.
0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.08.2015, 21:51
Цитата Сообщение от castaway Посмотреть сообщение
AncientPenguin, "ничего" в указателях не бывает.
А теперь вызови метод этой машинки по этому указателю в этом методе должно выводиться что-то доказывающее что это точно конкретная машина, т.е.

C++
1
2
3
4
5
Car * car = nullptr;
car->blabla = "эта машинка";
car->print();
car->blabla = "точно эта машинка";
car->print();
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.08.2015, 21:53
Цитата Сообщение от ct0r Посмотреть сообщение
Ну скажем, вернулось нам число 1. Берем &OtherClass::field (данные). Тоже вернуло 1. Это понимать, что адреса у виртуальной функции и поля одинаковые, значит они указывают на одну и ту же область данных, или как?
что значит "вернулось число 1" ?

у вас есть переменная "указатель" которая либо хранит чего-то там, определяемое её типом.
либо невалидное.

это все, что вам нужно знать.
что бы пользоваться.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.08.2015, 22:00
Цитата Сообщение от AncientPenguin Посмотреть сообщение
А теперь вызови метод этой машинки
Я не понимаю того, что ты хочешь мне донести и что ждёшь от меня.

Добавлено через 2 минуты
1. Указатель - это хранитель адреса, и ничего кроме адреса он содержать не может.
2. Если ОС не позволяет читать/писать по нулевому адресу, то это не означает что ноль в контексте указателя - не адрес.
0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.08.2015, 22:05
Цитата Сообщение от castaway Посмотреть сообщение
и что ждёшь от меня.
Доказательств что по адресу nullptr полноценный объект типа Car со всеми вытекающими.

Цитата Сообщение от castaway Посмотреть сообщение
Я не понимаю того, что ты хочешь мне донести
Что nullptr и 0 логически не одно и то же, хоть физически это так. nullptr за тем и нужен что он обозначает ничего. 0 математически это ничто, но адрес 0 это не ничто, это вполне обычный адрес, а вот nullptr это математический 0, а не нулевое смещение в ОЗУ. Программист видя nullptr ожидает что внутри не адрес объекта, а пустота.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
27.08.2015, 22:08
Цитата Сообщение от castaway Посмотреть сообщение
большая цитата мне ни о чем не говорит.
Ну там перечислены случаи, в которых null pointer - это не указатель с адресом 0.

Цитата Сообщение от hoggy Посмотреть сообщение
что значит "вернулось число 1" ?
у вас есть переменная "указатель" которая либо хранит чего-то там, определяемое её типом.
либо невалидное.
это все, что вам нужно знать.
что бы пользоваться.
Именно. Нам не нужно знать, адрес там или не адрес. Более того, там не адрес. Если ты думаешь, что там адрес, то ты уже лезешь в дебри, и тогда тот вопрос, который я тебе задал (про результаты после каста к инту), по-прежнему актуален.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.08.2015, 22:14
Цитата Сообщение от AncientPenguin Посмотреть сообщение
Доказательств что по адресу nullptr полноценный объект типа Car со всеми вытекающими.
Если его туда поместить, то он там будет.

Цитата Сообщение от AncientPenguin Посмотреть сообщение
nullptr за тем и нужен что он обозначает ничего.
Скорее им принято обозначать отсутствие объекта в современных ОС. Но это не говорит о том что он (указатель) никуда не указывает.

Добавлено через 2 минуты
Цитата Сообщение от ct0r Посмотреть сообщение
Ну там перечислены случаи, в которых null pointer - это не указатель с адресом 0.
Мм.. не могу найти где такое говорится. Можешь выделить?
0
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.08.2015, 22:22
Цитата Сообщение от castaway Посмотреть сообщение
Если его туда поместить, то он там будет.
Хотелось бы посмотреть как ты его туда поместишь именно на С++ и именно в nullptr.

Цитата Сообщение от castaway Посмотреть сообщение
Скорее им принято обозначать отсутствие объекта в современных ОС. Но это не говорит о том что он никуда не указывает.
О, да мы уже близко, а теперь подумай куда конкретно указывает указатель который точно не указывает на объект? Не куда он физически указывает, не какая там цифра в переменной, а куда он указывает чисто с точки зрения логики? В никуда же.

Нет понятное дело что если я уберу дорожный указатель в гараж то куда-то он все таки будет указывать. Но вот какой смысл в указателе на котором написано Москва, а указывает он в космос? Сточки зрения логики это указатель в никуда несмотря на то что направление там в принципе есть.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.08.2015, 22:30
Цитата Сообщение от ct0r Посмотреть сообщение
Именно. Нам не нужно знать, адрес там или не адрес. Более того, там не адрес. Если ты думаешь, что там адрес, то ты уже лезешь в дебри, и тогда тот вопрос, который я тебе задал (про результаты после каста к инту), по-прежнему актуален.
там адрес.
это - публичная информация, которая определяет причину существования указателя.
по адресу мы стучим к объекту.

что именно представляет из себя адрес - это не важно.

важно, что мы можем по этому адресу тыркать объекты.

разве это не очевидно?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.08.2015, 22:37
Цитата Сообщение от AncientPenguin Посмотреть сообщение
Хотелось бы посмотреть как ты его туда поместишь именно на С++ и именно в nullptr.
В виду особенности реализации примера я пока не могу поместить туда классовый объект, но я могу поместить туда практически любые другие данные, размеры которых находятся в пределах разумного. Ради демонстрации, конечно же.

Цитата Сообщение от AncientPenguin Посмотреть сообщение
В никуда же.
Ещё раз. В никуда он указывать не может. Это тебе не черная дыра. Он в любом случае указывает на какие-то данные, о существовании которых ты можешь и не знать.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.08.2015, 22:39
Цитата Сообщение от castaway Посмотреть сообщение
Если его туда поместить, то он там будет.
покажите кодом.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.08.2015, 22:49
Цитата Сообщение от hoggy Посмотреть сообщение
покажите кодом.
Можно на ты.
Я могу это показать, смастерив пример без ОС на С++11, но мне важен результат. А именно, чтобы хоть кто-то из тех кто утверждал что в указателе может быть что-то помимо адреса признает обратное. Иначе я просто не вижу смысла на этом заморачиваться тратить на это время.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
27.08.2015, 22:53
castaway,
Цитата Сообщение от ct0r Посмотреть сообщение
Some Honeywell-Bull mainframes use the bit pattern 06000 for (internal) null pointers.
Most users (in ring 11) have null pointers of 0xB00000000000. It was common on old CDC ones-complement machines to use an all-one-bits word as a special flag for all kinds of data, including invalid addresses.
The Symbolics Lisp Machine, a tagged architecture, does not even have conventional numeric pointers; it uses the pair <NIL, 0> (basically a nonexistent <object, offset> handle) as a C null pointer.
Цитата Сообщение от hoggy Посмотреть сообщение
там адрес.
это - публичная информация, которая определяет причину существования указателя.
по адресу мы стучим к объекту.
что именно представляет из себя адрес - это не важно.
важно, что мы можем по этому адресу тыркать объекты.
разве это не очевидно?
Ну то есть в этом топике ты подразумевал под адресом некую концепцию данных, через которую можно получить доступ к объектам, а я - именно физический адрес в виде числа, по которому можно обратиться к памяти и забрать данные. В общем, понятно все.

Цитата Сообщение от castaway Посмотреть сообщение
Тип не имеет значения.
Мне это выдает ожидаемый сегфолт. Я не могу привести пока что-то из стандарта, запрещающее так делать для встроенных типов, но для классов нам в конструкторах и присваиваниях понадобятся ссылки, а null references быть не может - это точно UB.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.08.2015, 22:59
Цитата Сообщение от ct0r Посмотреть сообщение
Мне это выдает ожидаемый сегфолт.
Разумеется. Я предлагал проверить это не на Linux или Windows.

ct0r, из цитаты видно, что там другое понятие о нулевых указателях. Не то, о котором мы сейчас говорим (С++>=11).
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.08.2015, 23:11
Цитата Сообщение от ct0r Посмотреть сообщение
Ну то есть в этом топике ты подразумевал под адресом некую концепцию данных, через которую можно получить доступ к объектам, а я - именно физический адрес в виде числа, по которому можно обратиться к памяти и забрать данные. В общем, понятно все.
я не имел ввиду "физический адрес".
поскольку это - такая же абстракция.

вы например, можете считать,
что указатель на объект содержит неккие циферки - адрес некоторой ячейки памяти.

ну и что?

вы все равно не знаете, что означают эти циферки - какие то данные "виртуальной страницы памяти".
сегодня это будет значить одно, потом другое.

я хочу сказать - это не принципиально.

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

как это порешается на низком уровне - не проблема программиста с++.

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

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
Я могу это показать, смастерив пример без ОС на С++11,
не важно как.
важно, что бы это был с++.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.08.2015, 23:11

Вычислить адрес верхушки стека, адрес следующей команды, адрес переменной, адрес которой содержится в BX
Помогите решить следующие задачи: 1.Вычислить адрес верхушки стэка. 2.Вычислить адрес следующей выполняемой программы. 3. Вычислить...

Указатели - почему pNext работает как ссылка на следующий адрес?
struct Node { int value; struct Node* pNext; // ссылка на следующий адрес }; struct AddressInfo { char name; char...

Массивы и Указатели: распечатать таблицу,содержащую имя переменной,ее значение и адрес
Условие:Написать программу,которая создает несколько переменных целого и вещественного типа,для каждой переменной создает указатель,а затем...

хочу только адрес страници
Вот я замечал порой заходя на сайт что, где нормально пишешь название сайта скажем www.aaa.com то на некоторых сайтах когда заходишь то...

Частный адрес, динамический адрес, статический адрес - какой у меня?
Привет. Открываем рубрику глупых вопросов. Я сижу с компьютера который подключен к интернету по кабелю, кабель от компьютера идёт к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Закрытая тема Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru