Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
WLF
1 / 2 / 0
Регистрация: 06.12.2013
Сообщений: 118

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

09.05.2014, 09:12. Показов 3561. Ответов 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, а не как указатель (закомментированые строки), то компилятор ругается на типы? Разве, чтобы хранить в переменной какой-то адрес надо обязательно объявлять её как указатель?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.05.2014, 09:12
Ответы с готовыми решениями:

Как объявлять указатель на массив указателей?
Народ, поясните как объявлять указатель на массив указателей и как отправлять его как параметр в функцию

Как правильно объявлять указатель на массив указателей?
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;malloc.h&gt; int main(){ int a, b; int *a1, *b1; a=1; b=7; a1=&amp;a; ...

Как правильно объявлять struct переменную?
Как правильно объявлять? str one или struct str one; #include &lt;iostream&gt; using namespace std; struct str { int a; int b; ...

38
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.05.2014, 08:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от 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.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.05.2014, 10:28
taras atavin, если сразу не понятно, вот еще пара ссылок:
http://stackoverflow.com/quest... n-practice
http://stackoverflow.com/quest... s-intptr-t
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.05.2014, 11:27
Эйси.
size_t is pointer size in practice
. size_t есть тип, чья разрядность практически равна разрядности указателя. Цитату в студию, где я утверждаю обратное.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.05.2014, 11:38
Цитата Сообщение от taras atavin Посмотреть сообщение
ровно один тип гарантирует, что в него влезет весь адрес - size_t
Это не так. size_t тип в первую очередь для хранения размера, а не адреса. В некоторых случаях разрядности size_t может не хватить для представления адреса. См. ещё раз ссылки, которые я давал.

Не по теме:

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

0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.05.2014, 11:46
Цитата Сообщение от Tulosba Посмотреть сообщение
size_t тип в первую очередь для хранения размера, а не адреса.
Где я утверждал обратное?
Цитата Сообщение от Tulosba Посмотреть сообщение
Это не так.
Разве? Чем, кроме возможности разыменования, различаются типы предназначенные для хранения размера памяти и адреса в этой памяти? Ведь ни кто не гарантирует, что size_t будет применён для хранения размера именно области памяти, причём, много меньшей, чем вся память, он обязан гарантировать свою достаточность для представления размера любой области памяти вне зависимости от возможности существования иных областей, не пересекающихся с данной.
0
Заблокирован
10.05.2014, 11:49
Цитата Сообщение от taras atavin Посмотреть сообщение
Ведь ни кто не гарантирует, что size_t будет применён для хранения размера именно области памяти
на самом деле в виртуальною память процесса можно достучаться как годно, просто через указатель - проще
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.05.2014, 11:55
Цитата Сообщение от newbie666 Посмотреть сообщение
на самом деле в виртуальною память процесса можно достучаться как годно, просто через указатель - проще
И как же ещё?
C++
1
((int*)p)=2;
тоже использует указатель, так как значение оператора приведения к указателю есть указатель. Только этот указатель - не переменная, а временное данное, существующее лишь номинально, так как приведение происходит без фактического преобразования, и только во время самой операции доступа по адресу, в этом указателе хранящемуся. Но это указатель, синтаксис языка запрещает без помощи указателя обращаться по адресу, хранимому не в самой инструкции, а в данном. Больше того, можно даже использовать указатель, являющийся значением выражения, то есть результатом вычисления, тогда для него вообще не надо заводить отдельную переменную.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.05.2014, 11:58
taras atavin, Вы ссылки смотрели, которые я приводил?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.05.2014, 12:04
Например,
C++
1
2
3
int *p=new int [2048];
*(p+264)=22;
delete [] p;
. Указателей здесь два, один p, а другой равен p+264*sizeof(int), причём, умножение подразумевается благодаря типизации p. А переменная то указательного типа одна - указатель p, целиком же фактический адрес элемента массива вообще не хранится в какой либо переменной.

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
Вы ссылки смотрели, которые я приводил?
А давайте без тумана и килострок текста? Конкретный пример прямо сюда, чтоб не продираться через всё остальное.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.05.2014, 12:23
Цитата Сообщение от 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!-)
отсюда

Перевод нужен или снова будете игнорировать факты и напускать туман?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.05.2014, 12:34
Эйси.
Восходят к временам сегментированных 16-разрядных архитектур например: массив может быть ограничен одним сегментом (так 16-битный size_t будет делать), но вы могли бы несколько сегментов (так 32-битный intptr_t Тип потребуется выбрать сегмент, а также смещение в нем). Я знаю, что эти вещи звучат странно в эти дни равномерно адресуемых несегментированной архитектур, но стандарт должен обслуживать более широкий круг, чем "что это нормально в 2009 году", вы знаете, -!).
Где здесь сказано, что size_t не достаточен?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.05.2014, 12:39
Цитата Сообщение от taras atavin Посмотреть сообщение
Где здесь сказано, что size_t не достаточен?
Т.е. первая цитата, где размеры указаны явно (128 бит для указателя и 32 для size_t) Вас не устроила, и надо выбрать для анализа цитату подлиннее?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
10.05.2014, 12:55
Интересно, как на этой платформе представить размер массива из полуквадриллиона символов? А ведь size_t предназначен для хранения размера и при 128-ми битном виртульном адресе и 50-ти битном адресе физическом на суперкомпьютере с большой физической памятью такой массив может существовать. Для малышей же такие адреса не предназначены.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.05.2014, 13:26
Цитата Сообщение от Tulosba Посмотреть сообщение
Т.е. первая цитата, где размеры указаны явно (128 бит для указателя и 32 для size_t) Вас не устроила, и надо выбрать для анализа цитату подлиннее?
да, давай цитату из стандарта
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.05.2014, 15:28
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) как на достаточный для хранения указателя, совершенно не понятно, зачем использовать другие типы. А равно как и пытаться доказывать их применимость для этих целей. В частном случае это вытекает из упомянутого выше неравенства, а в общем случае не является верным.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.05.2014, 10:08
Если неравенство не верно, то тип не годен и для хранения размера любого возможного массива. Ссылки на то, что в сегментной модели массив должен помещаться в один сегмент, не принимаются, так как на c++ массив-объект может иметь произвольное внутреннее представление, включая связный список, а указатель на следующий элемент списка может включать в себя не только смещение, но и номер сегмента. Кроме того, можно сделать и иерархический массив с применением массивов указателей, также включающих в себя и номера сегментов. Или дерево физических массивов опять таки на таких указателях.
Таким образом, само назначение типов исключает нарушение неравенства за исключением случаев, когда разрядность адреса превышает необходимую для адресации всех байтов любой возможной физической памяти, но именно в таком случае указатель может быть сжат до минимально необходимой разрядности, а я ведь не утверждал, что size_t достаточен для хранения именно не сжатого указателя. Так вот, после сжатия неравенство опять таки станет истинным. Пример же на хранение в size_t не сжатого адреса - это всего лишь пример, звёздочка может быть и в прототипе декодирующей функции.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.05.2014, 12:24
Цитата Сообщение от taras atavin Посмотреть сообщение
так как на c++ массив-объект может иметь произвольное внутреннее представление, включая связный список,
Вероятно, это только в Вашем понимании так. Потому что по стандарту массив это именно непрерывная область памяти.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
17.05.2014, 07:15
Герберта Шилдта почитай. Он предлагает несколько реализаций разреженного массива и ни одна не непрерывна. Там и линейный список, и массив указателей и даже список указателей на физические подмассивы. Массив, на который наложено подобное обязательное условие, - это массив на чистом c, а не на c++. А на c++, как и на паскале, массив есть контейнер однотипных элементов, адресуемых с помощью индекса, являющегося операндом некоторого применимого к самому массиву оператора. Причём, значения индекса не являются идентификаторами, объявленными в типе самого массива, поэтому
C++
1
2
3
4
5
6
7
8
struct A
{
 int x;
 int y;
 int z;
 int t;
};
A a;
- не массив. Кроме того, что мешает использовать соседние сегменты?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.05.2014, 22:14
Цитата Сообщение от 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 Посмотреть сообщение
что мешает использовать соседние сегменты?
Используемая модель памяти.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2014, 22:14
Помогаю со студенческими работами здесь

Объясните как в JSP объявлять и вызывать глобальную переменную???
С сервлетом всё понятно - ВСЁ работает а на JSP ругается и ругается. Пример с сервлетом Объявляю в начале программы переменную(Класс...

Сохранение адреса переменной пользовательского класса в переменную типа int или double
Здравствуйте. Подскажите, возможно ли это: есть переменная пользовательского класса. Я хочу сохранить её адрес (ведь это же просто число...

Используя указатель на переменную типа string, удалить последний символ этой переменной
есть указатель на переменную string,нужно удалить последний символ этой переменной работая с указателем.Как это осуществить?Заранее...

Составьте описание типа данных для хранения фамилии, имени, отчества, адреса
Помогите составить на любом примере

Опишите переменную Tovar для хранения структуры данных
На картинке схема.


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru