Ссылка на указатели и массивы в C - PullRequest
0 голосов
/ 21 октября 2018

В учебнике есть некоторые коды и пояснения

#include <stdio.h>

typedef int *byte_pointer;
void show_bytes(byte_pointer start, size_t len){
int i;
for(i=0; i<len; i++)
    printf(" |%.2x",start[i]);
printf("\n");
}

void show_int(int x){
show_bytes((byte_pointer) &x, sizeof(int));
}

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

Правильно ли, что указатель (например, тип int) имеет тип int (4 байта), поэтому он считывает 4 байта (например, адрес 0x100 ~ 0x103) или конец данных хотя мы просто даем начальный адрес (ex.0x100)?Я прав?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

В вашем коде start[i] получает значение в ячейке памяти start + sizeof(int) * i, которое, скорее всего, не то, что вы (или автор учебника) хотите.

Вы должны заменить

typedef int *byte_pointer;

by

typedef unsigned char *byte_pointer;

Тогда start[i] дает вам i-ю ячейку памяти после start, потому что sizeof(unsigned char) == 1.

0 голосов
/ 21 октября 2018

Названия этого примера плохо соответствуют.Арифметика указателей определяется размером элемента, на который установлен указатель.если указатель:

type * ptr;

, то каждый ptr [i] будет помещать вас в то место, на которое указывает указатель, плюс i * (sizeof (type));Тип

может быть char, int, long, size_t и так далее.это зависит от типа данных, на которые вы указываете.если вы указываете на массив символов, например, размер (char) составляет один байт.поэтому, чтобы перейти ко второму элементу, вам нужно перейти к init.местоположение и переместить один байт, чтобы прочитать один байт данных, который является вторым элементом.

...