2 / 2 / 0
Регистрация: 09.11.2014
Сообщений: 124
1

Выделение памяти для указателя

07.07.2016, 22:11. Показов 4131. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста разобраться в одном примере:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int main()
{
    double wages[3] = { 10000.0, 20000.0, 30000.0 };
    double* pw = wages;
 
    cout << sizeof(wages) << " = size of wages array\n";
    cout << sizeof(pw) << " = size of pw pointer";
 
    cin.get();
}
В данном случае выводится информация о том, что размер массива равен 24 байтам, что мне понятно, а память выделяемая для указателя равна 4. Вот мне и не понятно почему 4, а не 8.
Видимо я не понял как устроены указатели. Я подумал, что когда указатель ссылается на какой-либо элемент он сохраняет это значение в ячейке памяти и соответственно размер указателя должен быть равен размеру типа, на который он указывает. Но потом нашел инфу о том, что указатель хранит в ячейке памяти адрес другой ячейки, на которую он собственно и ссылается.
В общем, действительно это так, почему указателю нужно в данном случает 4 байта и всегда ли указатель занимает только 4 байта?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2016, 22:11
Ответы с готовыми решениями:

Создание указателя на объект и выделение памяти
Не пойму почему при добавлении одного указателя выдает ошибку Этот код работает class A {...

Динамическое выделение памяти / Передача указателя на строку в функцию
Здравствуйте друзья. Помогите пожалуйста разобраться с выделением динамической памяти. Ситуация...

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

Ссылка, Указатель, Область памяти выделенная оператором new для указателя
Подскажите пожалуйста, как сделать ссылку на область памяти выделенную оператором new для указателя...

20
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
07.07.2016, 22:17 2
само значение указателя (например 0x22ff08) в 32-разрядной ос занимает 4 байта
1
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
07.07.2016, 22:22 3
Говорили, что есть случаи, когда больше (или может я не совсем верно понял), но классический указатель зависит от архитектуры: для x86 - 4, для x64 - 8.
1
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
07.07.2016, 22:24 4
nmcf, да, верно.
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
07.07.2016, 22:27 5
Цитата Сообщение от HenryDukart Посмотреть сообщение
4 байта всегда для современных ОС
Для "современных" как раз 8.
1
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
07.07.2016, 22:32 6
nmcf, да. Стормозил чего-то.

Не заметил, что вы уже дали ответ, поэтому изменил то сообщение.
0
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 455
07.07.2016, 22:43 7
Цитата Сообщение от Iron Brain Посмотреть сообщение
Я подумал, что когда указатель ссылается на какой-либо элемент он сохраняет это значение в ячейке памяти и соответственно размер указателя должен быть равен размеру типа, на который он указывает.
Тип указателя и тип элемента на который он указывает - разные типы и они не обязаны быть равны по размеру друг другу.

В х86 4 байта для указателя, х64 - 8. Как уже выше сказали.

C++
1
2
struct Over100500Bytes; // over 100500 байт
Over100500Bytes* ptr;   // 4 или 8 байт
2
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
07.07.2016, 22:55 8
Лучший ответ Сообщение было отмечено Iron Brain как решение

Решение

добавлю-ка я и свои пять копеек
указатель хранит адрес
и размер его должен быть достаточен чтобы этот адрес полностью влез
для современных линейных систем
для 32битных систем память адресуется от 0 до 4Гб (232-1) достаточно 32 бит что и есть 4 байта
для 64битных максимальная ячейка 264-1 соответственно 64 бита или 8 байт
когда появятся 128битные системы будет 16 байт
а вот во времена ДОС указатели были разные
память там адресовалась сегмент: смещение каждый из элементов 16 бит
соответственно были короткие указатели(near) 2 байта, указывал на ячейку в том же сегменте
и длинные(far) 4 байта, чтобы хранить и сегмент и смещение
3
2 / 2 / 0
Регистрация: 09.11.2014
Сообщений: 124
07.07.2016, 22:59  [ТС] 9
ValeryS, ну моя система 64 бит, почему тогда указатель равен 4 байтам?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
07.07.2016, 23:04 10
Цитата Сообщение от Iron Brain Посмотреть сообщение
ну моя система 64 бит, почему тогда указатель равен 4 байтам?
а программу ты компилишь как 64битную? или все таки как 32битную?
современные компиляторы могут сделать и то и другое, зависит от настроек
0
2 / 2 / 0
Регистрация: 09.11.2014
Сообщений: 124
07.07.2016, 23:08  [ТС] 11
ValeryS, а выбор разрядности программы нужно смотреть в настройках ide или в коде можно прописать? Как мне это сделать в VS community?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
07.07.2016, 23:11 12
Цитата Сообщение от Iron Brain Посмотреть сообщение
а выбор разрядности программы нужно смотреть в настройках ide
именно там
Цитата Сообщение от Iron Brain Посмотреть сообщение
Как мне это сделать в VS community?
я максимум работал с 2010, про современные ничего не скажу
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
07.07.2016, 23:17 13
В настройках проекта.
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
07.07.2016, 23:23 14
Цитата Сообщение от nmcf Посмотреть сообщение
В настройках проекта.
правильно
это я неудачно выразился, давно со студией не работал
0
2 / 2 / 0
Регистрация: 09.11.2014
Сообщений: 124
07.07.2016, 23:26  [ТС] 15
ValeryS, я уже нашел. Разрядность программы выбирается одним кликом в верхней панели инструментов прямо рядом с кнопкой запуска отладки, но я никогда на это не обращал внимания
2
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
08.07.2016, 00:24 16
Iron Brain, размер массива из трёх double равен утроенному размеру double. Это связано со стандартом:
IEEE 754 (IEEE Standard for Binary Floating-Point Arithmetic ) и не зависит от разрядности OS. То есть, 8 байт. Размер указателя (на что бы то ни было) зависит от разрядности адресной шины системы и OS. То есть, 4 или 8 байт (или 16 или 10500) . То что указателю можно присвоить массив не означает того, что это одно и то же и имеет один размер. Имеет место неявное приведение типа массива к указателю.
Попробуйте так:
C++
1
2
3
4
5
6
7
8
double wages[3] = { 10000.0, 20000.0, 30000.0 };//это массив double
//его длина равна трём длинам double
 
double * pwages[3] = { &wages[0], &wages[1], &wages[2] };//это массив указателей на double
//его длина равна трём длинам указателей на double
 
cout << sizeof(wages) << " = size of wages array\n";
cout << sizeof(pwages) << " = size of pwages array\n";
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.07.2016, 00:31 17
Цитата Сообщение от ValeryS Посмотреть сообщение
добавлю-ка я и свои пять копеек
Цитата Сообщение от ValeryS Посмотреть сообщение
соответственно были короткие указатели(near) 2 байта, указывал на ячейку в том же сегменте
и длинные(far) 4 байта, чтобы хранить и сегмент и смещение
Ну, доведу уж, до десяти. Если сейчас сказать "COM" - кто-то вспомнит Component object model, кто-то RS-232, а кто-то, все-таки, формат исполняемых файлов доса. Т.к. там был один сегмент на все - модель памяти была плоская - как сейчас. И, следовательно, только near указатели.
2
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
08.07.2016, 05:53 18
avgoor,
1
IGPIGP
08.07.2016, 09:49
  #19

Не по теме:

Командный файл компактен и быстр. Это не экзешник, конечно. Хоть и ограничен одним сегментом. Вообще, на этих болотах новичку легко и потеряться. Ужасти сумеречные: near, far...
-А где же huge? Наш третий друг? Ушёл на болота?
-Его съела собака, сер...

Цитата Сообщение от "Гемпширская трясина. Техническое описание"
Да, беспутный Ньюго стал проклятьем не только рода, но и бедной собачки. Её желудок испорчен безнадёжно и навсегда. Теперь, кого бы она не съела, - жутко воет по ночам.
Простите за отступление. :-[

0
avgoor
08.07.2016, 14:24     Выделение памяти для указателя
  #20

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Командный файл компактен и быстр. Это не экзешник, конечно. Хоть и ограничен одним сегментом.
Прям описание персонажа при выборе из какой-нибудь древней игрушки.:)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2016, 14:24

Что если для указателя на ноль выделить место в динамической памяти?
int* arr; arr = nullptr; arr = new int; for (int i = 0; i &lt; 10; i++) { arr = i; } ...

выделение памяти для массива
#include &lt;stdio.h&gt; #include &lt;locale.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; int main() { ...

Выделение памяти для строки
Почему размер строки первой 4 байта а второй 50 байт?Первая должна сколько же. #include &lt;stdio.h&gt;...

Выделение памяти для массива
верно ли выделил память для массива если нет поправьте, заранее спасибо) class type { private:...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru