указатели и адреса памяти - PullRequest
2 голосов
/ 20 марта 2012

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

Мне стало интересно, возможно ли установить указатель char на начало переменной int, а затем пошагово пройти через int, как если бы это был 1-байтовый символ, используя указатель char.

Есть ли способ сделать это или что-то подобное? Я попытался установить указатель на тип int, но когда я делаю шаг вперед на 1, вместо этого он прыгает на 4 байта.

Просто пытаюсь придумать альтернативные способы сделать то же самое.

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

Конечно, вы можете, этот код показывает поведение:

#include <stdio.h>

int main()
{
  int value = 1234567;
  char *pt = (char*) &value;

  printf("first char: %p, second char: %p\n", pt, pt+1);
}

Это выводит:

first char: 0x7fff5fbff448, second char: 0x7fff5fbff449

Как вы можете видеть, разница составляет всего 1 байт, как задумано, это потому, что арифметикауказатели были сделаны после приведения типа к меньшему типу данных.

2 голосов
/ 20 марта 2012

Я думаю, что это должно делать то, что вы хотите:

int x = 42;
char *c = (char *) &x;
char byte0 = c[0];
char byte1 = c[1];
char byte2 = c[2];
char byte3 = c[3];
1 голос
/ 20 марта 2012

Да, указатель на символ будет шагать на 1 байт за раз, вы, вероятно, непреднамеренно приводите его к типу int.

Другая сложность - порядок байтов в int, по крайней мере, на Intel

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