L'aritmetica dei puntatori non serve per vari motivi, uno dei tanti e' si cerca sempre di piu' di non averli tra le scatole, a favore di oggetti piu' smart, come le collezioni STL, e gli smart pointer, iteratori
Avere un puntatore vuol dire, nel 99% dei casi, avere a che fare con allocazione/deallocazione di memoria, che si cerca di delegare sempre di piu' agli oggetti smart, piuttosto che gestirla a mano.
Anche la gestione degli array multidimensionali cosi' come e' fatta in C e' a tutti gli effetti inutile, se non per far ammattire I principianti.
Una qualunque libreria di algebra lineare, che macina per sua natura, tensori di qualunque rango/dimensione, usa SOLO VETTORI, che poi visualizza a seconda di come li si vuole considerare (vettore, matrice, tensore, ..).
Questo perche' e' operazione normale quella di 'ristrutturare' una matrice in un vettore o viceversa, o calcolare la trasposta, che in realta' NON VIENE calcolata, cioe' NON VIENE CREATA UNA COPIA, ma si fanno giochi di prestigio SOLO con gli indici e le dimensioni.
Inoltre, una buona parte delle operazioni di algebra lineare vengono fatte sull'intero vettore e quindi scandirlo con un'unico indice e' molto efficiente, e si possono sfruttare le istruzioni assembler per le operazioni vettoriale (SSE, AVX, ....)
Nota: un tensore e' la versione generalizzata di una matrice. Il numeri di 'dimensioni e' detto 'rango'
Scalare/numero: tensore di rango 0 (zero)
Vettore: tensore di rango 1
Matrice: tensore di rango 2
Cubo: rensore di rango 3
...
L'esistenza dei puntatori? Ricorda: compatibilita' all'indietro!
Infine, da quanto ho letto, finalmente in una delle prossime revisioni del C++ introducono il garbage collector.