Преобразование значения int в разность указателей символов в C и C ++ - PullRequest
0 голосов
/ 05 января 2019

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

int i = 54;
char *ii;
ii = &i;
printf("%d\n", *ii);

Вывод:

54

Хотя когда я пишу то же самое на C ++, это не работает.

int i = 54;
char *ii;
ii =  (char *)&i;
cout<<*ii;

Вывод:

6

Может кто-нибудь объяснить, почему это происходит и как мне заставить его работать в C ++.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

При звонке printf вот так:

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

Спецификатор формата %d означает, что данный аргумент int будет напечатан как int. Даже если вы передаете char, поскольку printf - это функция с переменным числом, она повышается до int, поэтому она соответствует спецификатору формата.

Когда вы выводите, используя cout:

cout<<*ii;

Оператор << перегружен на char. Поскольку правая сторона имеет тип char, это перегрузка, которая используется. Этот конкретный экземпляр << печатает аргумент как char. Поскольку код ASCII 54 соответствует символу '6', это то, что печатается.

Вы получите противоположные результаты, если будете использовать %c в формате printf, и если вы произнесете *ii в int при вызове cout.

0 голосов
/ 05 января 2019

Разное не то же самое. Попробуйте это:

#include <cstdio>
#include <iostream>

int main() {
    int i = '6';
    char *ii = reinterpret_cast<char*>(&i);
    std::printf("%c\n", *ii);
    std::printf("%d\n", *ii);
    std::cout << *ii << '\n';
    std::cout << (int)*ii << '\n';
}

Инициализация i до '6' - это просто пояснение.

При вызовах printf значение char, на которое указывает *ii, повышается до int в вызове функции. Типы, меньшие int, повышаются, когда они являются аргументами переменной части функции, которая принимает список переменных параметров (например, printf).

Первый оператор printf печатает значение *ii как символьное значение; вы получите «6». Вторая печатает его как целочисленное значение; вы получите любое значение, представляющее символ '6' (в ASCII это 54, что, вероятно, вы и увидите).

Первая вставка в std::cout вставляет значение char; потоковые вставки перегружены для целочисленных типов, поэтому вы получаете вставщик, который принимает аргумент типа char, и он отображает символ, который представляет значение, так же, как первый вызов printf.

Вторая вставка в std::cout вставляет целое значение *ii, как и второй вызов printf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...