И последнее, что касается указателей C: не знаете, что будет делать этот фрагмент кода? - PullRequest
0 голосов
/ 18 октября 2011

У меня есть значение указателя, сохраненное в b + 4, в которое я хотел бы загрузить 'a'. По сути, у меня есть b + 4 - указатель на указатель на беззнаковое целое (адрес, на который указывает a). Тем не менее, мне было интересно, будет ли этот код на самом деле хранить всю «а» (так как «а» составляет 4 байта), или левое значение будет просто хранить 1 байт:

    void *a = //something;
    *((unsigned **)((char*)b+4)) = a;

Меня смущает вопрос, будет ли вторая строка хранить 'a' как символ или как беззнаковое целое ...

* edit: Итак, было бы иначе, если бы я сделал:

    *((char *)b + 4) = a;

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Все указатели имеют одинаковый размер.Поэтому не имеет значения, указывает ли RHS на 4-байтовую переменную, а LHS указывает на 1-байтовую переменную.Важно то, что вы разыгрываете RHS перед назначением на LHS.Поэтому действует следующее:

int c;
void * a = &c;

unsigned d;
unsigned * e = &d;
unsigned ** b = &e;
b = (unsigned **)&a;
1 голос
/ 18 октября 2011

* ((без знака **) ((char *) b + 4)) = a;

Разрешение на указатель.
Указатель - это тип, который простоуказывает (хранит) адрес типа (о котором он объявлен).Также обратите внимание, что все указатели в системе будут иметь одинаковый размер.

Так что в этом случае
Указатель на b+4 просто указывает / сохраняет адрес, который хранит a.
У вас будет два указателя, указывающих на один и тот же адрес.

    |----------|                                 
    |   b+4    |                            
    |          |  1000                       
    |   2000   |                             
    |----------|                               
          |                                           
          |
          |
          |
          -------------------->|----------|
                               |   num    |
          -------------------->|          |  2000
          |                    |    2     |  This is what a points to   
          |                    |----------|
          |
          |
    |----------|                             
    |     a    |                            
    |          |  3000                       
    |   2000   |                             
    |----------|    

* ((char *) b + 4) = a;

Не разрешается тип указателя. Вы пытаетесь присвоить указатель не типу указателя, поэтому он должен выдать предупреждение.

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