Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
dserp18
10 / 10 / 0
Регистрация: 20.01.2013
Сообщений: 97
Записей в блоге: 4
#1

типы указателей Подбельский - C++

20.07.2013, 22:01. Просмотров 2012. Ответов 32
Метки нет (Все метки)

пример из книжки Подбельского
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream.h>
#include <iomanip.h>
int main(){
   unsigned long L=0x12345678L;
   char *cp = (char *) &L;  
   int *ip = (int *) &L;
   long *lp = (long *) &L;
      cout<<hex;
      cout<<"Address L= "<<&L<<"\n"; 
      cout<<"cp= "<<(void *)cp<<"\t"; 
      cout<<"*cp= "<<(int) *cp<<"\n"; 
      cout<<"ip= "<<(void *)ip<<"\t"; 
      cout<<"*ip= "<< *ip<<"\n"; 
      cout<<"lp= "<<(void *)lp<<"\t"; 
      cout<<"*lp= "<<*lp<<"\n"; 
        }
должно выводиться
*cp=78
*ip=5678
*lp=12345678
но у меня выводится *ip=12345678, хотя указатель типа int должен вроде бы вмещать 2 байта. Тогда в чем же дело?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2013, 22:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос типы указателей Подбельский (C++):

типы указателей - C++
Помогите понять, что от меня хотят в этом задании: &quot;выбрать данные из памяти с помощью разных типов указателей (float, char)&quot;

Не получается преобразовать типы указателей на функцию - C++
Доброго всем времени суток. Подскажите пожалуйста как сделать есть тип указателя на функцию. typedef void (*pfn_RawMouseOnLeftDown ...

по поводу указателей. Как правильно задавать массив указателей и его удалять? - C++
Т.е., например создаю указатель: TPoint *p_Point=NULL; а если массив? TPoint *p_MassPoint; //=?; как массив обнулить не ясно ...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей? - C++
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей - C++
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си) - C++
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе указателя на int нужна звёздочка (*), а...

32
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
20.07.2013, 22:07 #2
Цитата Сообщение от dserp18 Посмотреть сообщение
хотя указатель типа int должен вроде бы вмещать 2 байта.
int вроде 4 байта.
0
Van111
210 / 189 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
20.07.2013, 22:10 #3
Цитата Сообщение от dserp18 Посмотреть сообщение
*lp=12345678
Цитата Сообщение от dserp18 Посмотреть сообщение
но у меня выводится *ip=12345678
помоему ожидание совпадает с действительностью
0
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
20.07.2013, 22:11 #4
В Borland C++ для DOS sizeof( int ) == 2, в компиляторах для Windows sizeof( int ) == 4
0
dserp18
10 / 10 / 0
Регистрация: 20.01.2013
Сообщений: 97
Записей в блоге: 4
20.07.2013, 22:40  [ТС] #5
нда действительно в моём компиляторе sizeof( int ) == 4. тогда почему я не могу сделать переменную double L= 0x123456789L хотя в моём компиляторе sizeof( double ) == 8. Т.е.
C++
1
2
3
4
5
6
#include <iostream.h>
#include <iomanip.h>
int main(){
   double  L=0x123456789L; 
...
}
компилятор выдает ошибку
integer constant is too large for "long" type
0
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
20.07.2013, 22:41 #6
Потому что в конце ставишь L.
0
Evg
Эксперт CАвтор FAQ
18467 / 6517 / 455
Регистрация: 30.03.2009
Сообщений: 18,200
Записей в блоге: 29
20.07.2013, 22:53 #7
Цитата Сообщение от dserp18 Посмотреть сообщение
хотя указатель типа int должен вроде бы вмещать 2 байта
http://www.cyberforum.ru/blogs/18334/blog69.html

Добавлено через 3 минуты
Цитата Сообщение от dserp18 Посмотреть сообщение
double L=0x123456789L
В этой записи условно два действия. В правой части ты описываешь константу типа long, преобразовываешь её к типу double и только потом записываешь в переменную типа double. Размер long'а на твоём компиляторе, судя по всему, равен 4 байтам, а потому такая константа вылезает за диапазон. Если хочешь задать константу типа double, то нужно к ней хоть какую-то дробную часть приделать

C
double L = 123456789.0
в шестнадцатиричной системе тут уже не получится писать
0
diagon
Higher
1932 / 1198 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
20.07.2013, 23:46 #8
Цитата Сообщение от dserp18 Посмотреть сообщение
пример из книжки Подбельского
Лучше выбросить ее подальше, автор вообще некомпетентен в с++.
0
zer0mail
2394 / 2026 / 202
Регистрация: 03.07.2012
Сообщений: 7,346
Записей в блоге: 1
21.07.2013, 12:57 #9
Когда писались некоторые старые книги, в С++ - компиляторах int и int* были 16-ти битными. По стандарту short не меньше 16 бит, long не меньше 32, а int между ними. С другой стороны, int всегда (т.е. лет 40, если учитывать Си) был таким, что вмещал указатель. Поэтому на 16-битных разрядах int был 16, а на 32-битных стал 32 бита. Теперь 64 бита и правило нарушилось. Появились int64, long long (64 бита).
Да и с самим long не все гладко: в большинстве случаев он 32 бита, но иногда 64 (модель данных LP), а в C# и Java всегда 64. Посмотреть размеры типов для разных моделей данных можно здесь: http://okolovich.info/model-dannykh-v-c/
0
Jupiter
Каратель
Эксперт С++
6565 / 3986 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.07.2013, 10:36 #10
Цитата Сообщение от zer0mail Посмотреть сообщение
По стандарту short не меньше 16 бит, long не меньше 32
цитату из стандарта, м?
0
zer0mail
2394 / 2026 / 202
Регистрация: 03.07.2012
Сообщений: 7,346
Записей в блоге: 1
22.07.2013, 11:04 #11
Я прочитал это у Страуструпа (специальное издание, Бином, 2011г, стр 120):
Здесь N может быть char, short int, int или long int. Кроме того, гарантируется, что под char отводится минимум 8 бит,
под short или int — минимум 16 бит, под long — минимум 32 бита.


А Страуструпу я верю
0
Croessmah
22.07.2013, 14:33
  #12

Не по теме:

Jupiter, вот:

There are five standard signed integer types : “signed char”, “short int”, “int”, “long int”, and “long long int”. In this list, each type provides at least as much storage as those preceding it in the list. There may also be implementation-defined extended signed integer types. The standard and extended signed integer types are collectively called signed integer types. Plain ints have the natural size suggested by thearchitecture of the execution environment; the other signed integer types are provided to meet special needs.

0
CheshireCat
Эксперт С++
2897 / 1246 / 78
Регистрация: 27.05.2008
Сообщений: 3,411
22.07.2013, 14:47 #13
Цитата Сообщение от zer0mail Посмотреть сообщение
А Страуструпу я верю
При всем уважении к д-ру Страуструпу, лучше все же верить Стандарту.
А он утверждает следующее:
sizeof(char) == 1
sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
0
Evg
Эксперт CАвтор FAQ
18467 / 6517 / 455
Регистрация: 30.03.2009
Сообщений: 18,200
Записей в блоге: 29
22.07.2013, 16:38 #14
Цитата Сообщение от zer0mail Посмотреть сообщение
Кроме того, гарантируется, что под char отводится минимум 8 бит
В стандарте говорится "1 байт", а не "8 бит"
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
22.07.2013, 16:53 #15
В С же есть <limits.h>, и там есть минимально возможные значения, напимер
maximum value for an object of type unsigned char
UCHAR_MAX 255 // 28 − 1
т.е. минимум 8 бит
maximum value for an object of type unsigned short int
USHRT_MAX 65535 // 216 − 1
т.е. минимум 16 бит
и т.д.
<climits> включает <limits.h>
0
22.07.2013, 16:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2013, 16:53
Привет! Вот еще темы с ответами:

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей - C++
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

Как обойтись без указателей и указателей на указатель? - C++
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace...

Различия указателей char* от указателей других типов - C++
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что касается указателей на тип int. Но что...

Создание массивов указателей на массивы указателей - C++
Помогите в решении задачи: создал массив указателей на массивы указателей на строки, но компилятор ругается на то что не может...


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

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

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