You can also "hide" the implementation of the usage in your code. You do this by changing every direct access to your data storage to corresponding functions, and your object isn't an array anymore but a struct:

typedef struct array4Dstruct array4D;

char createArray4D(array4D*, int dimX, int dimY, int dimZ); // prototype for create function, return value contains error code

int accessElement(array4D*, int x, int y, int z);
int setElement(array4D*, int x, int y, int z, int newValue);
Now, the only thing you need to do is write a header file that defines array4Dstruct and another C file that implements the functions. If you think that you're not satisfied by your implementation, you can only change the header and the other C file and leave your code unmodified.