Добавление целого числа к указателю


В следующем коде,

#include<stdio.h>   
int main()  
{  
  short a[2]={5,10};  
  short *p=&a[1];  
  short *dp=&p;  
  printf("%pn",p);  
  printf("%pn",p+1);  
  printf("%pn",dp);  
  printf("%pn",dp+1);  
}  

Теперь вывод, который я получил, был : 0xbfb45e0a
0xbfb45e0c
0xbfb45e04
0xbfb45e06

Здесь я понял p и p+1, но когда мы делаем dp+1, то так как dp указывает на указатель на short, а так как указатель на short имеет размер 4 байта, то dp+1 должен увеличиться на 4 единицы, но это
увеличивается только на 2.
Пожалуйста, объясните причину.

2 2

2 ответа:

dp определяется как указатель на шорт, а шорт-это два байта. Это все, о чем заботится компилятор. Чтобы на самом деле сделать dp указатель на указатель на короткий, вам нужно сделать

short **dp = &p;

Это не имеет значения где dp очки. Это указатель на short , поэтому добавление работает путем увеличения адреса памяти на sizeof(short) == 2.