Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
WLF
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 14
#1

Обязательно ли объявлять переменную для хранения адреса переменной как указатель? - C++

09.05.2014, 09:12. Просмотров 1107. Ответов 38
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Указатели
#include <iostream>
 
using namespace std;
 
int Variable;
int *pVariable;
// int pVariable;
int main()
{
    setlocale(LC_ALL, "rus");
 
    Variable = 777;
    pVariable = &Variable;
 
    cout << "Переменная Variable\t = " << Variable << endl;
    cout << "Адрес Variable\t\t = " << &Variable << endl;
    cout << "Значение по этому адресу = " << *pVariable << endl;
    // cout << "Значение по этому адресу = " << pVariable << endl;
return 0;
}
Скажите, почему, если я объявляю переменную pVariable просто как int, а не как указатель (закомментированые строки), то компилятор ругается на типы? Разве, чтобы хранить в переменной какой-то адрес надо обязательно объявлять её как указатель?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 09:12     Обязательно ли объявлять переменную для хранения адреса переменной как указатель?
Посмотрите здесь:

C++ Описать класс,содержащий переменную для хранения текстовой строки.
Как вывести на экран переменную из функции, которой присваиваеться значение через указатель? C++
C++ Где объявлять переменную: перед циклом, или внутри класса
Как в переменную записать текст, а затем в конце добавить значение переменной? C++
C++ Не обязательно разыменовывать указатель на функцию при вызове?
C++ Можно ли как-то словить номер элемента используя указатель, а не переменную
C++ Как на основе того что лежит в переменной сделать переменную в объекте?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.05.2014, 08:18     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #21
Цитата Сообщение от Tulosba Посмотреть сообщение
типа size_t может не хватить для представления адреса.
Это где же я такое написал то? Изначально предлагался long int, вот его и может не хватить, если вдруг адрес будет 128-ми битным, а long int останется 64-х битным. И даже long long int - не выход, если адрес вдруг станет 256-ти битным. Виртуальные адреса могут иметь любую разрядность, ни как не связанную с объёмом физической памяти и даже превосходить двоичный логарифм реально доступного объёма памяти на множитель в виде любой степени двойки и единственный не указательный тип, разрядность которого гарантировано достаточна для представления адреса - это как раз size_t, так как это платформенно-зависимый тип, разрядность которого растёт вместе с разрядностью адреса.

Добавлено через 8 минут
Что касается вопроса в названии темы, переменную для использования в качестве указателя можно декларировать не указательного типа. Но при всяком её использовании понадобится приведение типа: при присваивании ей значения приведение указателя к её типу, а при обращении по адресу явное приведение самой переменной к указателю. Это дополнительные синтаксические сложности, вызванные тем, что единственная сущность, для которой разрешён синтаксис, за которым скрывается необходимая для обращения по адресу косвенная адресация, - это указатель. Всё остальное адрес может только хранить, да и то ровно один тип гарантирует, что в него влезет весь адрес - size_t, остальные могут оказаться пригодными лишь для хранения части адреса, например, приращения в 256-ти байтном параграфе (char и uint8_t при адресации по смещению каждого байта).

Добавлено через 1 минуту
Тем не менее, часть адреса можно хранить в переменной любого типа, вопрос лишь в том, какую именно часть адреса можно хранить в переменной каждого типа. Можно даже поизвращаться и хранить весь адрес в строке, количество символов которой уравнять с sizeof(size_t).

Добавлено через 6 минут

Limit of size_t:

{SIZE_MAX}
65535
Это в 16-ти битных версиях. У меня 32-х битный компилятор, под ним 4294967296.
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.05.2014, 10:28     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #22
taras atavin, если сразу не понятно, вот еще пара ссылок:
http://stackoverflow.com/questions/1...ze-in-practice
http://stackoverflow.com/questions/1...-t-vs-intptr-t
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.05.2014, 11:27     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #23
Эйси.
size_t is pointer size in practice
. size_t есть тип, чья разрядность практически равна разрядности указателя. Цитату в студию, где я утверждаю обратное.
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.05.2014, 11:38     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #24
Цитата Сообщение от taras atavin Посмотреть сообщение
ровно один тип гарантирует, что в него влезет весь адрес - size_t
Это не так. size_t тип в первую очередь для хранения размера, а не адреса. В некоторых случаях разрядности size_t может не хватить для представления адреса. См. ещё раз ссылки, которые я давал.

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
разрядность практически равна разрядности указателя
"У меня практически нет недвижимости за рубежом" © Бывший депутат ГД РФ Пехтин В.А.

taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.05.2014, 11:46     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #25
Цитата Сообщение от Tulosba Посмотреть сообщение
size_t тип в первую очередь для хранения размера, а не адреса.
Где я утверждал обратное?
Цитата Сообщение от Tulosba Посмотреть сообщение
Это не так.
Разве? Чем, кроме возможности разыменования, различаются типы предназначенные для хранения размера памяти и адреса в этой памяти? Ведь ни кто не гарантирует, что size_t будет применён для хранения размера именно области памяти, причём, много меньшей, чем вся память, он обязан гарантировать свою достаточность для представления размера любой области памяти вне зависимости от возможности существования иных областей, не пересекающихся с данной.
newbie666
Заблокирован
10.05.2014, 11:49     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #26
Цитата Сообщение от taras atavin Посмотреть сообщение
Ведь ни кто не гарантирует, что size_t будет применён для хранения размера именно области памяти
на самом деле в виртуальною память процесса можно достучаться как годно, просто через указатель - проще
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.05.2014, 11:55     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #27
Цитата Сообщение от newbie666 Посмотреть сообщение
на самом деле в виртуальною память процесса можно достучаться как годно, просто через указатель - проще
И как же ещё?
C++
1
((int*)p)=2;
тоже использует указатель, так как значение оператора приведения к указателю есть указатель. Только этот указатель - не переменная, а временное данное, существующее лишь номинально, так как приведение происходит без фактического преобразования, и только во время самой операции доступа по адресу, в этом указателе хранящемуся. Но это указатель, синтаксис языка запрещает без помощи указателя обращаться по адресу, хранимому не в самой инструкции, а в данном. Больше того, можно даже использовать указатель, являющийся значением выражения, то есть результатом вычисления, тогда для него вообще не надо заводить отдельную переменную.
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.05.2014, 11:58     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #28
taras atavin, Вы ссылки смотрели, которые я приводил?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.05.2014, 12:04     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #29
Например,
C++
1
2
3
int *p=new int [2048];
*(p+264)=22;
delete [] p;
. Указателей здесь два, один p, а другой равен p+264*sizeof(int), причём, умножение подразумевается благодаря типизации p. А переменная то указательного типа одна - указатель p, целиком же фактический адрес элемента массива вообще не хранится в какой либо переменной.

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
Вы ссылки смотрели, которые я приводил?
А давайте без тумана и килострок текста? Конкретный пример прямо сюда, чтоб не продираться через всё остальное.
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.05.2014, 12:23     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #30
Цитата Сообщение от taras atavin Посмотреть сообщение
А давайте без тумана и килострок текста?
Там всё написано буквально в самых первых ответах:
AFAIK, on AS/400 pointers are 128-bit, but size_t is defined to be 32-bit.
отсюда
Hark back to the days of segmented 16-bit architectures for example: an array might be limited to a single segment (so a 16-bit size_t would do) BUT you could have multiple segments (so a 32-bit intptr_t type would be needed to pick the segment as well as the offset within it). I know these things sound weird in these days of uniformly addressable unsegmented architectures, but the standard MUST cater for a wider variety than "what's normal in 2009", you know!-)
отсюда

Перевод нужен или снова будете игнорировать факты и напускать туман?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.05.2014, 12:34     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #31
Эйси.
Восходят к временам сегментированных 16-разрядных архитектур например: массив может быть ограничен одним сегментом (так 16-битный size_t будет делать), но вы могли бы несколько сегментов (так 32-битный intptr_t Тип потребуется выбрать сегмент, а также смещение в нем). Я знаю, что эти вещи звучат странно в эти дни равномерно адресуемых несегментированной архитектур, но стандарт должен обслуживать более широкий круг, чем "что это нормально в 2009 году", вы знаете, -!).
Где здесь сказано, что size_t не достаточен?
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.05.2014, 12:39     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #32
Цитата Сообщение от taras atavin Посмотреть сообщение
Где здесь сказано, что size_t не достаточен?
Т.е. первая цитата, где размеры указаны явно (128 бит для указателя и 32 для size_t) Вас не устроила, и надо выбрать для анализа цитату подлиннее?
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.05.2014, 12:55     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #33
Интересно, как на этой платформе представить размер массива из полуквадриллиона символов? А ведь size_t предназначен для хранения размера и при 128-ми битном виртульном адресе и 50-ти битном адресе физическом на суперкомпьютере с большой физической памятью такой массив может существовать. Для малышей же такие адреса не предназначены.
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.05.2014, 13:26     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #34
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. первая цитата, где размеры указаны явно (128 бит для указателя и 32 для size_t) Вас не устроила, и надо выбрать для анализа цитату подлиннее?
да, давай цитату из стандарта
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.05.2014, 15:28     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #35
3.7.4.3 Safely-derived pointers
1 A traceable pointer object is
— an object of an object pointer type (3.9.2), or
— an object of an integral type that is at least as large as std::intptr_t, or
— a sequence of elements in an array of character type, where the size and alignment of the sequence
match those of some object pointer type.
3 An integer value is an integer representation of a safely-derived pointer only if its type is at least as large as std::intptr_t...
Теперь, относительно того, что такое size_t:
18.2/6
The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size in bytes of any object.
В сухом остатке: если sizeof(size_t) >= sizeof(std::intptr_t), то в size_t может быть сохранен указатель на объект. Но отношение м/у их размерами не регламентировано стандартом. К тому же, если есть тип, на который можно опираться (std::intptr_t) как на достаточный для хранения указателя, совершенно не понятно, зачем использовать другие типы. А равно как и пытаться доказывать их применимость для этих целей. В частном случае это вытекает из упомянутого выше неравенства, а в общем случае не является верным.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.05.2014, 10:08     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #36
Если неравенство не верно, то тип не годен и для хранения размера любого возможного массива. Ссылки на то, что в сегментной модели массив должен помещаться в один сегмент, не принимаются, так как на c++ массив-объект может иметь произвольное внутреннее представление, включая связный список, а указатель на следующий элемент списка может включать в себя не только смещение, но и номер сегмента. Кроме того, можно сделать и иерархический массив с применением массивов указателей, также включающих в себя и номера сегментов. Или дерево физических массивов опять таки на таких указателях.
Таким образом, само назначение типов исключает нарушение неравенства за исключением случаев, когда разрядность адреса превышает необходимую для адресации всех байтов любой возможной физической памяти, но именно в таком случае указатель может быть сжат до минимально необходимой разрядности, а я ведь не утверждал, что size_t достаточен для хранения именно не сжатого указателя. Так вот, после сжатия неравенство опять таки станет истинным. Пример же на хранение в size_t не сжатого адреса - это всего лишь пример, звёздочка может быть и в прототипе декодирующей функции.
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.05.2014, 12:24     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #37
Цитата Сообщение от taras atavin Посмотреть сообщение
так как на c++ массив-объект может иметь произвольное внутреннее представление, включая связный список,
Вероятно, это только в Вашем понимании так. Потому что по стандарту массив это именно непрерывная область памяти.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.05.2014, 07:15     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #38
Герберта Шилдта почитай. Он предлагает несколько реализаций разреженного массива и ни одна не непрерывна. Там и линейный список, и массив указателей и даже список указателей на физические подмассивы. Массив, на который наложено подобное обязательное условие, - это массив на чистом c, а не на c++. А на c++, как и на паскале, массив есть контейнер однотипных элементов, адресуемых с помощью индекса, являющегося операндом некоторого применимого к самому массиву оператора. Причём, значения индекса не являются идентификаторами, объявленными в типе самого массива, поэтому
C++
1
2
3
4
5
6
7
8
struct A
{
 int x;
 int y;
 int z;
 int t;
};
A a;
- не массив. Кроме того, что мешает использовать соседние сегменты?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 22:14     Обязательно ли объявлять переменную для хранения адреса переменной как указатель?
Еще ссылки по теме:

C++ Как передать указатель функции, чтобы значение переменной изменилось?
Как использовать указатель на переменную во входящем параметре функции? C++
C++ Как правильно объявлять struct переменную?
Char и указатель на переменную C++
C++ Используя указатель на переменную типа string, удалить последний символ этой переменной

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
17.05.2014, 22:14     Обязательно ли объявлять переменную для хранения адреса переменной как указатель? #39
Цитата Сообщение от taras atavin Посмотреть сообщение
Герберта Шилдта почитай. Он предлагает несколько реализаций разреженного массива и ни одна не непрерывна.
Герберт Шилдт. С++ Базовый курс (3-е издание). Глава 5: Массивы и строки:
В C++ все массивы занимают смежные ячейки памяти. (Другими словами, элементы массива в памяти расположены последовательно друг за другом.)
ISO/IEC 14882:2011 8.3.4 Arrays:
An object of array type contains a contiguously allocated non-empty set of N subobjects of type T.
Даже вики:
Массив (в некоторых языках программирования также таблица, ряд) — набор однотипных компонентов (элементов), расположенных в памяти непосредственно друг за другом, доступ к которым осуществляется по индексу (индексам).
Поэтому не стоит думать, что массивом является любой объект, для которого реализован operator[]. Это не так.

Цитата Сообщение от taras atavin Посмотреть сообщение
что мешает использовать соседние сегменты?
Используемая модель памяти.
Yandex
Объявления
17.05.2014, 22:14     Обязательно ли объявлять переменную для хранения адреса переменной как указатель?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru