Мне нужно подробное объяснение того, почему указатель указывает на [2], потому что я не понимаю, и я думал, что он указал на [4] - PullRequest
0 голосов
/ 13 марта 2019

Я не понимаю, почему после последней строки pshrt указывает на [2], может кто-нибудь объяснить подробно, пожалуйста?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void main ()
{
    short a[10],*pshrt,shrt;
    char *pchar;
    int i;
    for (i=0;i<10;i++)
        a[i]=rand();
    //show
    for (i=0;i<10;i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\n\n");
    pchar = (char*)a;
    pshrt = (short*)(pchar+4);
    printf("%d",*pshrt);
}

1 Ответ

1 голос
/ 13 марта 2019

a - это массив short, который, вероятно, составляет два байта в вашей системе.Вы увеличиваете char * до этого массива на 4, поэтому вы продвигаетесь вперед на 4 байта.Поскольку элементы массива по два байта каждый, перемещение вперед на два байта является эквивалентом перемещения вперед двух элементов.

Я не уверен, является ли ваш код строго допустимым, поскольку вы используете псевдоним char * с помощьюshort *.Это может быть технически законно, поскольку базовый элемент фактически равен short, но если вы увеличили char * на нечетную величину, а затем привели его к short *, теперь вы делаете доступ без выравнивания.

...