Почему значение char увеличивается на 3? - PullRequest
0 голосов
/ 19 сентября 2019


Я имею дело с указателями в C, объявляя целочисленное значение как 1025. Затем я изменил целое число на char.Когда я увеличиваю указатель на 1, значение увеличивается на 3. Как это происходит?

#include<stdio.h>
int main(){
    int a = 1025;
    int *p;
    p = &a;

    char *p0;
    p0 = (char*)p;
    printf("Address = %d, value = %d\n",p0,*p0);
    printf("Address = %d, value = %d\n",p0+1,*(p0+1));

    return 0;

Ответы [ 4 ]

3 голосов
/ 20 сентября 2019

Когда вы используете char * для псевдонима объекта другого типа, как вы делаете, это позволяет вам получить доступ к байтовому представлению этого объекта.

Значение 1025может быть представлен в шестнадцатеричном виде как 0x0401.Похоже, ваша система использует порядок байтов в младшем порядке для хранения целых чисел, что означает, что младшие байты появляются первыми в представлении.

Таким образом, если предположить, что int - это 32 бита, то в вашей системе a выглядит следующим образомв памяти:

  -----------------------------
a | 0x01 | 0x04 | 0x00 | 0x00 |
  -----------------------------

Указатель p0 указывает на первый байт, поэтому *p0 равен 1. Затем p0+1 указывает на следующий байт, поэтому *(p0+1) равен 4.

1 голос
/ 19 сентября 2019

Ваш вывод показывает, что происходит:

Address = 1204440828, value = 1
Address = 1204440829, value = 4

Обратите внимание, что адрес того, что вы печатаете, меняется на единицу.Таким образом, вы не добавляете 1 к a, вы смотрите на значение в расположении a + 1.

ОБНОВЛЕНИЕ: Как пояснение: указатель указывает на intно вы печатаете его как серию byte значений.Таким образом, тот факт, что первый байт значения 1025 оказывается декодированным до 1 Если вы измените a на какое-то другое значение, вы получите несколько случайный вывод.Попробуйте изменить int a = 1035, и вы получите 11 и 4 вместо 1 и 4.

0 голосов
/ 19 сентября 2019

Если вы хотите получить доступ к следующему элементу, доступ к нему можно получить, увеличив значение указателя, а не значение char.Увеличение значения указателя позволит этому указателю указывать на адрес следующего значения, и, следовательно, вы увидите значение по адресу.

0 голосов
/ 19 сентября 2019

Вы увеличиваете указатель на байты, из которых состоит целое число a.Кстати, 1025 состоит из двух байтов со значениями 1 и 4 - вы можете проверить.1025 = 4*256 + 1.Поэтому, когда вы переходите от 1 к 4, похоже, что он был увеличен на 3

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