|
|
|
Правильно ли я понимаю нижеуказанное приведение данных?
|
|||
|---|---|---|---|
|
#18+
День добрый! В книжке встретил такое приведение данных для записи в двоичный файл: Код: plaintext binfil - успешно открытый файловый поток и int n; Сказано, что первый аргумент должен иметь тип char *. Соответственно, требуется приведение данных. Далее, идет такая фраза: "Выражение принимает адрес переменной n, но преобразует этот адрес к типу char *". Правильно ли я понимаю, что, если на пальцах, данные по этому адресу приводятся к типу char, т.е. значение переменной n после приведения будет иметь тип char? И второй вопрос. Почему приведение, в данном случае, осуществляется к типу char? Заранее благодарен. С уважением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 12:20 |
|
||
|
Правильно ли я понимаю нижеуказанное приведение данных?
|
|||
|---|---|---|---|
|
#18+
A.D.День добрый! В книжке встретил такое приведение данных для записи в двоичный файл: Код: plaintext binfil - успешно открытый файловый поток и int n; Сказано, что первый аргумент должен иметь тип char *. Соответственно, требуется приведение данных. Далее, идет такая фраза: "Выражение принимает адрес переменной n, но преобразует этот адрес к типу char *". Правильно ли я понимаю, что, если на пальцах, данные по этому адресу приводятся к типу char, т.е. значение переменной n после приведения будет иметь тип char? И второй вопрос. Почему приведение, в данном случае, осуществляется к типу char? Заранее благодарен. С уважением. 1) Неправильно. Ежели на пальцах указатель на int приводится к указателю на char. А вот с данными никто ничего не делает... 2) Надо в файл написать представление числа в виде набора байт, ни и приводит к соотвествующему виду ибо байт = 8 бит и char = 8бит. Ну можно привести еще к unsigned char ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 12:31 |
|
||
|
Правильно ли я понимаю нижеуказанное приведение данных?
|
|||
|---|---|---|---|
|
#18+
blinded[quot A.D.] 1) Неправильно. Ежели на пальцах указатель на int приводится к указателю на char. А вот с данными никто ничего не делает... Тогда, еще больше запутался. Если исходить из того, что есть указатель. Допустим, есть указатель int *p = 5. Если я правильно понимаю, то р - это адрес переменной, по которому хранится переменная типа int со значением 5. Если мы приводим данные к другому типу, то тут понятно. К примеру, было значение int = 5, привели к double, стало значение double = 5. Теперь. Что тогда происходит, в контексте, приведенной схемы, в том случае, если к другому типу приводится: 1. адрес? 2. указатель на один тип? Если можно, с каким-нибудь простеньким примерчиком. Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 13:12 |
|
||
|
Правильно ли я понимаю нижеуказанное приведение данных?
|
|||
|---|---|---|---|
|
#18+
A.D. Тогда, еще больше запутался. Если исходить из того, что есть указатель. Допустим, есть указатель int *p = 5. Если я правильно понимаю, то р - это адрес переменной, по которому хранится переменная типа int со значением 5. А вот и не угадал. Это значит что p указывает на int, адрес которого в адресном пространстве процесса 5. И значение *з совсем не 5, а то что написано в 4 байтах начиная со смещения 5. A.D. Если мы приводим данные к другому типу, то тут понятно. К примеру, было значение int = 5, привели к double, стало значение double = 5. А вот может и не повезти, особливо ежели большее к меньшему приводить... A.D. Теперь. Что тогда происходит, в контексте, приведенной схемы, в том случае, если к другому типу приводится: 1. адрес? 2. указатель на один тип? Если можно, с каким-нибудь простеньким примерчиком. Заранее благодарен. Так совсем каша в голове. Адрес и указатель есть близнецы братья... Адрес - это 4 или 8 байтовое целое - индех ячейки памяти в адресном пространстве. Берешь адрес объекта (оператор &) в результате получаешь указатель. Теперь адрес можно по разному интерпретировать можно сказать что адрес 0x00C0FFEE - это int*, тогда 4 байта начиная с указанного байта программа интерпретирует как int, или сказать что это double* - тогда 8 байт начиная с subj будут интерпретированы как double А вообще книжки читать надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 13:53 |
|
||
|
Правильно ли я понимаю нижеуказанное приведение данных?
|
|||
|---|---|---|---|
|
#18+
"Р указывает на int" - физически это как выглядит? В книжке приводилась такая схема: int n = 5; int *p; р=&n; *p = 5; Т.е. физически р - это значение адреса, а *р - то, что хранится по этому адресу. Теперь, если я Вас правильно понял, приведение типа указателя к другому - это физически означает, что от указанного адреса "отсчитывается" другое количество байт (при int - 4, при double - 8). Я, дико извиняюсь, немного Вас помучаю! Предположим, есть адрес- 1000. Если значение int, то 1000, 1001, 1002 и 1003 заняты этим значением. Допустим есть преобразование в double. Значит теперь имеем с 1000 по 1007. Так? Тогда, что происходит с содержимым, хранящимся с 1000 по 10003? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 14:13 |
|
||
|
Правильно ли я понимаю нижеуказанное приведение данных?
|
|||
|---|---|---|---|
|
#18+
ничего, гораздо более интересно что будет в другой части сколько байт отсчитывать от начала зависит от того какой тип имеет указатель! -------------------------------------------------------------- [подпись с другого сайта] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 14:21 |
|
||
|
Правильно ли я понимаю нижеуказанное приведение данных?
|
|||
|---|---|---|---|
|
#18+
Т.е. если ремзюмировать: фактически, приведение типа указателя к другому типу, это изменение количества отсчитываемых (от начального адреса) адресов? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 14:29 |
|
||
|
Правильно ли я понимаю нижеуказанное приведение данных?
|
|||
|---|---|---|---|
|
#18+
A.D."Р указывает на int" - физически это как выглядит? В книжке приводилась такая схема: int n = 5; int *p; р=&n; *p = 5; Т.е. физически р - это значение адреса, а *р - то, что хранится по этому адресу. Ну так! Если еще точнее *p это то как мы интерпретируем данные по этому адресу A.D.Теперь, если я Вас правильно понял, приведение типа указателя к другому - это физически означает, что от указанного адреса "отсчитывается" другое количество байт (при int - 4, при double - 8). Ну совсем. Это не только размер но и представление данных. Ведь если ежели у int все просто, то объект какого-нибудь класса - очень сложная структура A.D.Я, дико извиняюсь, немного Вас помучаю! Предположим, есть адрес- 1000. Если значение int, то 1000, 1001, 1002 и 1003 заняты этим значением. Допустим есть преобразование в double. Значит теперь имеем с 1000 по 1007. Так? Тогда, что происходит с содержимым, хранящимся с 1000 по 10003? Заранее спасибо. Абстрагируйся от int, double и прочих типов и классов. Вот у компа есть память в нем байты лежат, эти байты можно по-раному интепретировать (жуткое слово но другое на ум не приходит) Вот взял кучу байт и смотрю на них как на int, могу посмотреть на них как на double. Могу взять и прибавить 1 к *(int*) 0x00C0FFEE; если теперь распечатать *(double*) 0x00C0FFE то результат будет ой-ой сам попробуй Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 14:51 |
|
||
|
Правильно ли я понимаю нижеуказанное приведение данных?
|
|||
|---|---|---|---|
|
#18+
Примерно понял. Остался, тогда, последний вопрос. Меняется ли СУТЬ данных от такой интерпретации? Ну, и как резюме: т.е. приведение указателя на данные к другому типу - это изменение размера данных + интерпретация данных с точки зрения типа, к которому мы приводим указатель? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 15:50 |
|
||
|
Правильно ли я понимаю нижеуказанное приведение данных?
|
|||
|---|---|---|---|
|
#18+
A.D.Примерно понял. Остался, тогда, последний вопрос. Меняется ли СУТЬ данных от такой интерпретации? Ну, и как резюме: т.е. приведение указателя на данные к другому типу - это изменение размера данных + интерпретация данных с точки зрения типа, к которому мы приводим указатель? Заранее спасибо. Вот про размер выкинь и будет все ок! Ибо размер - определяется типом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 16:14 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34421862&tid=2029158]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 385ms |

| 0 / 0 |
