Преобразование /typecasting Int указатель на указатель char, но получение символов ascii?

-7

Итак, я прошел учебник для указателей на C/C++, и преподаватель приходит к типизации

он говорит, что для C вывод адреса из указателя int на указатель char может быть выполнен следующим образом:

int f = 1025;
int *point = &f;
char *point3;
point3 = (char*)point;

Я делаю это, но получаю смайлик и изображение Diamond acsii (показано в img-ссылке).

Поэтому я пытаюсь использовать reinterpret_cast<char*>(point) так как я искал его: "Возможно, это эквивалент C++", теперь он выглядит так:

int f = 1025;
int *point = &f;
char *point2;
point2 = reinterpret_cast<char*>(point);

но я все еще получаю два забавных персонажа acsii.

Я что-то упускаю? Не знаю, как это исправить, так как я только начал в главе указателей.

целая программа

#include <iostream>

using namespace std;
int main(){

int f = 1025;
int *point = &f;
cout << sizeof(f) << endl;
cout << "value" << *point << "address" << point << endl;
char *point2;
point2 = reinterpret_cast<char*>(point); // using method i found
char *point3;
point3 = (char*)point; // using method given in the tutorial
cout << endl;
cout << "value" << *point2 << "address" << point2 << " "<< point3 << endl;

system("pause");
return 0;
}

enter image description here

Учебное пособие я следил

спросил(а) 2016-03-11T20:18:00+03:00 3 года, 11 месяцев назад
0
91

Да, когда вы говорите

point3 = (char*)point

Вы преобразование целочисленного указатель point на указатель символов point3. point предназначен для указания целых чисел (которые, конечно, многобайтовые величины), а point3 может указывать на отдельные байты.

Итак, теперь point3 указывает на отдельные байты, на которые указывает point, или, другими словами, байты, составляющие целое число f.

Но важно то, что сами байты никоим образом не изменены. Используя разные типы указателей, мы можем по-разному смотреть на байты, но опять же, байты не меняются.

Если мы скажем

printf("%d\n", *point);

мы берем целую point указателя, выбираем int, на которую указывает, и печатаем ее. Так что, конечно, мы видим " 1025 ".

Если мы скажем

printf("%02x %02x\n", *point3, *(point3 + 1));

мы используем point3 для извлечения и печати двух отдельных байтов. Мы могли бы увидеть что-то вроде " 01 04 ". Теперь, что это значит? Ну, число 1025 в шестнадцатеричном (основание 16) равно 0x401, поэтому мы выбрали два байта 0x01 и 0x04 которые составляют его.

(Вы можете удивиться, почему два байта выглядят так, как будто они находятся в "неправильном порядке", и это происходит из-за общего "маленького конца" представления, которое является историей на другой день. Но если вы использовали "большой конец" "машина, с 32-битным ints, вы бы видели" 00 00 ", и вы были бы еще более смущены.)

Так почему вы получили смайлик и бриллиант? Я не уверен, но это, вероятно, персонажи со значениями 1 и 4 на вашем компьютере. Вероятно, вы пытались напечатать их как символы, а не как шестнадцатеричные значения, как я.

Наконец, вы могли подумать, что путем "преобразования указателя int в указатель char" вы могли бы каким-то образом преобразовать целое число в строку. Но нет, вы не делали ничего подобного.

Да, в C указатель char * (char *) часто используется для ссылки на строку. Но это не означает, что путем преобразования чего-то в char * вы преобразовываете его в строку. (Опять же, все, что вы конвертируете, это указатель.)

Байты, которые составляют значение 1025, всегда будут 0x04 и 0x01. Единственный способ конвертировать их в десятичную строку (в C) - это вызов printf и использование %d или вызов нестандартной функции, такой как itoa(). Или, в C++, вы можете использовать <<.

ответил(а) 2016-03-11T21:00:00+03:00 3 года, 11 месяцев назад
48

Причиной всегда видеть значение char* является поведение оператора <<. Этот оператор рассматривает char* как c-строки, а не как адреса.

Если вы хотите напечатать адрес, переведите его в (void*):


 cout << (void*) point2;

Надеюсь, я был ясен, и я правильно понял ваш вопрос.

ответил(а) 2016-03-11T20:27:00+03:00 3 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема