C allows this. This, however, is not enough. Thus, there is little direct support for modularization, and programmers are forced to create their own conventions. A truly modular language provides data encapsulation and information hiding. The implementation details for data structures should be hidden.
C allows modular programming only if the programmer follows some very rigid rules.
In a typical C program, the number of unessential pointers outnumbers essential pointers by a large amount. For example, C tradition encourages programmers to use pointers to access arrays when other good methods already exist. This overabundance of pointers also means that optimizers must be more cautious and employ careful dataflow techniques. The semantics of arrays are so specifically defined that its hard to extend C to treat them as more primitive objects that permit operations on them as a whole e.g. on Vector machines. C has no notion of dynamically allocated arrays whose bounds are determined at run time.