je moet gewoon zien:
a[5]; -> a zelf is een pointer naar een plaats waar men 5 variabelen heeft opgeslagen. Dus moet je gewoon malloc(5*sizeof(uwtype)) doen om een plaats te vinden waar 5 variabelen na elkaar kunnen worden opgeslagen.
a[5][5] -> a wijst nu naar een plaats waar 5 pointer variabelen (adressen) zijn opgeslagen, die op hun beurt wijzen naar 5 plaatsen waar 5 gewone variabelen zijn opgeslagen. uw allocatie wordt dus eerst malloc(5*sizeof(uwtype*)) en dan 5x (via for lus) malloc(5*sizeof(uwtype)). Dus eerst zoek je een plaats waar 5 pointers na elkaar kunnen worden opgeslagen, dan nog eens 5 plaatsen waar 5 gewone variabelen na elkaar kunnen worden opgeslagen.
a[5][5][5]-> a wijst naar 5 pointers, die wijzen elk weer naar 5 pointers, die wijzen dan elk weer naar 5 variabelen. dus:
malloc(5*sizeof(uwtype**)), dan 5x: malloc(5*sizeof(uwtype*)), dan 25x: malloc(5*sizeof(uwtype)). Hier zoek je dus weer eerst naar een plaats waar 5 pointers kunnen worden opgeslagen, dan naar 5 plaatsen waar 5 pointers kunnen worden opgeslagen, en dan uiteindelijk naar 25 plaatsen in het geheugen waar 5 variabelen kunnen worden opgeslagen

.
en zo gaat het maar door

. Goed te onthouden is dat hierin dus elk blokje van 5 wel samenhangt, maar niet alles na elkaar, bv. in het laatste: a[5][5][5]: dit kan dus 5^3=125 variabelen bevatten, maar deze zullen zich uiteindelijk allemaal per blokjes van 5 bevinden, en niet allemaal na elkaar in het geheugen!
als je dan bv. a[2][3][4] hebt heb je eerst een blokje van 2 pointers, dan 2 blokjes van 3 pointers = 6 pointers, en dan 6 blokjes van 4 variabelen

.
hopelijk hielp dit beetje

. Nu ga ik me beetje proberen storten op wiskundige analyse 1

ad: