あたりまえだけどintを連続で宣言すれば連続したところにメモリ確保される

Objective-CをやるにあたりC言語を駆け足で復習中
普段LLしかやらないので、直接メモリを触ってる感じが楽しい。

例題でこういうのがあった

#include <stdio.h>

int main(void)
{
        int i1,i2,i3;
        printf("%p,%p,%p\n", &i1,&i2,&i3);
        return 0;
}

ってやると

toyoshi@ant:~/c$ ./a.out
0x7ffff32ac88c,0x7ffff32ac888,0x7ffff32ac884
toyoshi@ant:~/c$ ./a.out
0x7fffe8ce7b8c,0x7fffe8ce7b88,0x7fffe8ce7b84
toyoshi@ant:~/c$ ./a.out
0x7fff75ed653c,0x7fff75ed6538,0x7fff75ed6534
toyoshi@ant:~/c$ ./a.out
0x7fff52fa6fbc,0x7fff52fa6fb8,0x7fff52fa6fb4
toyoshi@ant:~/c$ ./a.out
0x7fff3c8ad4cc,0x7fff3c8ad4c8,0x7fff3c8ad4c4
toyoshi@ant:~/c$ ./a.out
0x7fffd99efe1c,0x7fffd99efe18,0x7fffd99efe14
toyoshi@ant:~/c$ ./a.out
0x7fff4b4669cc,0x7fff4b4669c8,0x7fff4b4669c4
toyoshi@ant:~/c$ ./a.out
0x7fff364096dc,0x7fff364096d8,0x7fff364096d4
toyoshi@ant:~/c$ ./a.out
0x7fffde10205c,0x7fffde102058,0x7fffde102054
toyoshi@ant:~/c$ ./a.out
0x7fff2fc39e7c,0x7fff2fc39e78,0x7fff2fc39e74

という感じで
なぜ宣言とは逆順にメモリが確保されるのか
なぜi3は必ず下一桁が4から始まるのか
というのが楽しい!だれか教えて

あとi1,i2,i3がキレイに4バイトずつずれるのも楽しい!