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

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

25.08.2015, 23:39. Показов 13818. Ответов 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
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.08.2015, 00:14
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А подробнее?
мне сейчас лень искать точные ссылки на стандарт.

но суть такая: функции-члены класса вызываются для реально существующего (валидного объекта).

если это не так - стандарт вам ничего не гарантирует.

ваш код можно переписать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout << "A() ";
    }
    void f()
    {
        cout << "Hello ";
    }
    ~A()
    {
        cout << "~A() ";
    }
};
 
void main()
{
    A *p = nullptr; //<--- заведомо не валидное 
    p->f();
}
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.08.2015, 00:15
Цитата Сообщение от John Prick Посмотреть сообщение
(Но в подавляющем большинстве случаев 0 - не доступная ячейка памяти)
По стандарту - в 100 процентах случаев.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.08.2015, 00:17
Цитата Сообщение от hoggy Посмотреть сообщение
стандарт вам ничего не гарантирует
так я написал "хак" то, что не гарантирует ясно же ж) Но будет работать ведь, так как ассемблер листинги для валидное и нет одинаковые, отсюда можно хаком работать и без валидного.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.08.2015, 00:37
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Но будет работать ведь
это не факт.

ну то есть, это работает на большинстве компиляторов сегодня.
но нет никакой гарантии, что будет раборать и завтра.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
26.08.2015, 04:33
Цитата Сообщение от hoggy Посмотреть сообщение
назовите 10 отличий нуля от адреса.
Ну все-таки нуль в контексте указателей - не адрес. Это особая штука, говорящая о том, что указатель ни на что не указывает. Мы же не говорим, что указатель указывает на объект с адресом 0. Да и тогда int* p=1 и дальнейшие операции над p работали бы так же, как и при int* p=0. Но они работают по-разному, потому что null pointer и просто невалидный указатель (указывающий фиг знает куда) - вещи разные. Можно вдобавок привести цитату из стандарта:
A valid value of an object pointer type represents either the address of a byte in memory (1.7) or a null pointer (4.10).

A null pointer constant is an integer literal (2.13.2) with value zero or a prvalue of type std::nullptr_t.
Из нее следует, что 0 - это не адрес байта в памяти.
Вообще если отвечать на изначальный вопрос (даже не учитывая при этом null pointer): указатели всегда хранят адреса? - ответ будет "в общем случае не всегда". Те же самые указатели на нестатические члены класса - хотя и называются указателями, но хранят смещения.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.08.2015, 09:17
Цитата Сообщение от ct0r Посмотреть сообщение
Те же самые указатели на нестатические члены класса - хотя и называются указателями, но хранят смещения.
Ну так это и не указатели, а особый тип данных, и стандартом не регламентируется что они должны хранить - смещения или сгущения - это зависит от реализации.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.08.2015, 09:32
Цитата Сообщение от ct0r Посмотреть сообщение
Ну все-таки нуль в контексте указателей - не адрес.
нуль обозначает невалидный адрес.
указатель не может содержать ничего иного, кроме адреса.

Цитата Сообщение от ct0r Посмотреть сообщение
Из нее следует, что 0 - это не адрес байта в памяти.
не следует.

Цитата Сообщение от ct0r Посмотреть сообщение
Те же самые указатели на нестатические члены класса - хотя и называются указателями, но хранят смещения.
детали реализации.
нас не очень интересует, почему они могут весить в несколько раз больше,
чем обычные указатели.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
26.08.2015, 12:03
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну так это и не указатели, а особый тип данных, и стандартом не регламентируется что они должны хранить - смещения или сгущения - это зависит от реализации.
Где ты в стандарте нашел, что это не указатели, укажешь пункт? По-моему, там ясно написано - _указатели_ на члены. Зависит от реализации - хорошо, сгущения - замечательно. Покажешь компилятор, где реализация на сгущениях или на чем там еще, а не на смещениях?

Цитата Сообщение от hoggy Посмотреть сообщение
нуль обозначает невалидный адрес.
указатель не может содержать ничего иного, кроме адреса.
Цитата Сообщение от hoggy Посмотреть сообщение
не следует.
Почему не следует? Где написано, что там может быть только адрес?
0 в контексте указателей - это абстракция. Что за ней стоит - вот это уже как раз детали реализации.

Цитата Сообщение от hoggy Посмотреть сообщение
детали реализации.
нас не очень интересует, почему они могут весить в несколько раз больше,
чем обычные указатели.
Да без разницы. Факт в том, что это не просто адрес.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.08.2015, 12:17
Цитата Сообщение от ct0r Посмотреть сообщение
Где написано, что там может быть только адрес?
в стандарте где то есть пункт, которые разъясняет что-то вроде:
"содержимое объекта определяется типом"

Цитата Сообщение от ct0r Посмотреть сообщение
0 в контексте указателей - это абстракция.
абстракция - это сишная строка.

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

Цитата Сообщение от ct0r Посмотреть сообщение
Что за ней стоит - вот это уже как раз детали реализации.
то, что нолик - невалидный указатель - это не детали реализации.
это - деталь интерфейса.

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

Цитата Сообщение от ct0r Посмотреть сообщение
Факт в том, что это не просто адрес.
нет, это просто адрес.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
26.08.2015, 12:52
Цитата Сообщение от hoggy Посмотреть сообщение
в стандарте где то есть пункт, которые разъясняет что-то вроде:
"содержимое объекта определяется типом"
Это хорошо, но никак не объясняет, почему в указателях только адрес. Если б это было так, то как минимум в разделе про нулевые указатели было бы упоминание invalid address или в этом духе. Или было бы утверждение, что в указателях только адреса. Но этого нет. Есть только то, что я процитировал уже.

Цитата Сообщение от hoggy Посмотреть сообщение
то, что нолик - невалидный указатель - это не детали реализации.
это - деталь интерфейса.
вот как компилятор разруливает эту ситуацию на платформах,
где по факту существует валидный адрес ноль - вот это уже детали реализации.
Так я про это и сказал. 0 - это абстракция. Это значит, что он не подразумевает адрес 0, за ним может стоять какой-нибудь невалидный ненулевой адрес или еще какая-нибудь хрень. И вот это уже - деталь реализации.

Цитата Сообщение от hoggy Посмотреть сообщение
нет, это просто адрес.
То есть по-твоему &MyClass::field - это просто адрес? И &MyClass::func, где func - это виртуальная функция, - это тоже просто адрес? То есть по этим адресам что-то хранится и я могу их просто разыменовать и получить какие-то данные?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.08.2015, 12:57
Цитата Сообщение от ct0r Посмотреть сообщение
Факт в том, что это не просто адрес.
Относительный адрес (смещение) - это ведь тоже адрес.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
26.08.2015, 13:19
hoggy, вот из стандарта
The value representation of pointer types is implementation-defined.
Ты как это понимаешь?

Цитата Сообщение от Tulosba Посмотреть сообщение
Относительный адрес (смещение) - это ведь тоже адрес.
Ну вообще да. Но мне показалось, что мы говорим об абсолютных адресах, которые можно тупо брать и разыменовывать без всяких дополнительных действий. Да и все равно - если взять к примеру указатели на виртуальные функции при множественном виртуальном наследовании - там не обойтись единственным относительным адресом.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.08.2015, 13:33
Цитата Сообщение от ct0r Посмотреть сообщение
мне показалось, что мы говорим об абсолютных адресах
Возможно, что действительно всего лишь показалось
Цитата Сообщение от ct0r Посмотреть сообщение
там не обойтись единственным относительным адресом.
Про единственность, собственно, тоже никто не говорил.
Я например под адресом имею ввиду нечто, что хранится в указателе. И неважно какого рода этот указатель. Просто от особенностей этих указателей (на переменную, на член, при обычном наследовании, при виртуальном) структура самого адреса тоже может меняться. Но тем не менее это всё равно остается адрес.
Возможно, именно из-за разной интерпретации, что такое "адрес" тема и начала разбухать
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.08.2015, 13:35
Цитата Сообщение от ct0r Посмотреть сообщение
Где ты в стандарте нашел, что это не указатели, укажешь пункт? По-моему, там ясно написано - _указатели_ на члены.
Мы с вами на брудершафт не пили вроде бы.
Да, совершенно справедливо написано, что есть указатели, и есть указатели на члены, и это не одно и то же. Такой указатель невозможно преобразовать в обычный указатель или указатель на функцию с помощью reinterpret_cast<>.
Цитата Сообщение от ct0r Посмотреть сообщение
Покажешь компилятор, где реализация на сгущениях или на чем там еще, а не на смещениях?
При чем тут компиляторы, если мы стандарт обсуждаем. Не надо выдумывать то, чего там нет, хоть оно и есть в компиляторах.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
26.08.2015, 13:49
Цитата Сообщение от Tulosba Посмотреть сообщение
Я например под адресом имею ввиду нечто, что хранится в указателе.
Мне кажется, что это немного странно, потому что тогда получается, что без понятия "указатель" адресов вроде как и не существует вовсе

Цитата Сообщение от Mr.X Посмотреть сообщение
Да, совершенно справедливо написано, что есть указатели, и есть указатели на члены, и это не одно и то же.
Указатель на член и указатель на объект не одно и то же, это очевидно. Как впрочем и то, что и то, и то - указатели.

Цитата Сообщение от Mr.X Посмотреть сообщение
При чем тут компиляторы, если мы стандарт обсуждаем. Не надо выдумывать то, чего там нет, хоть оно и есть в компиляторах.
Ну окей, стандарт так стандарт. Можешь показать, где в стандарте написано, что в указателе на объект должен быть только адрес и ничего кроме?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.08.2015, 14:05
Цитата Сообщение от ct0r Посмотреть сообщение
Можешь показать, где в стандарте написано, что в указателе на объект должен быть только адрес и ничего кроме?
Страуструп для меня авторитетнее стандарта, а он черным по белому пишет, что переменная типа T* содержит адрес объекта типа T. Да все тут очевидно, какой смысл блукать в трех соснах?

Добавлено через 2 минуты
Цитата Сообщение от ct0r Посмотреть сообщение
Как впрочем и то, что и то, и то - указатели.
А вот это уже выдумки.
0
1406 / 648 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
26.08.2015, 14:22
Хоть это C-faq, но всё же:
Whenever a programmer requests a null pointer, either by writing ``0'' or ``NULL'', it is the compiler's responsibility to generate whatever bit pattern the machine uses for that null pointer.
The language definition states that for each pointer type, there is a special value--the ``null pointer''--which is distinguishable from all other pointer values and which is ``guaranteed to compare unequal to a pointer to any object or function.
Больше интересного: http://c-faq.com/null/index.html
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
26.08.2015, 14:25
Цитата Сообщение от Mr.X Посмотреть сообщение
Да все тут очевидно, какой смысл блукать в трех соснах?
Значит тут все очевидно и цитата из стандарта не нужна, а со смещениями не очевидно и цитата из стандарта нужна? Наглые двойные стандарты Кстати, давай вспомним твоего любимого Страуструпа, вот его цитата:
A pointer to member is an offset-like construct that allows a programmer to indirectly refer to a member of a class.
Он тоже повыдумывал насчет смещения? Кстати, он же авторитетнее стандарта, так что кажется, ты в тупике

Цитата Сообщение от Mr.X Посмотреть сообщение
Страуструп для меня авторитетнее стандарта, а он черным по белому пишет, что переменная типа T* содержит адрес объекта типа T.
Ну давай цитатку прям и название книги. А то я вижу только
That is, a variable of type T* can hold the address of an object of type T.
Надеюсь, мне не надо объяснять, что "может" и "обязана" - слова разные?

Цитата Сообщение от Mr.X Посмотреть сообщение
А вот это уже выдумки.
Нет, это у кого-то склонности к дискриминации.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.08.2015, 14:42
Цитата Сообщение от ct0r Посмотреть сообщение
это у кого-то склонности к дискриминации
Ну да, фантазеров и выдумщиков не люблю, ибо засоряют информационное пространство своими бреднями. Книжки надо внимательней читать.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
26.08.2015, 14:49
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну да, фантазеров и выдумщиков не люблю, ибо засирают информационное пространство своими бреднями. Книжки надо внимательней читать.
Вот и почитал бы внимательней Страуструпа, раз мы выяснили, что ты точно и не помнишь, что он писал Авось, почистилось бы пространство-то хоть чуточку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.08.2015, 14:49

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru