C programs are built from collections of functions (which have behaviour) and objects (which have values; variables are objects), the natures of which are indicated by their types. C compilers read through source files sequentially, looking for names of types, objects and functions being referred to by other types, objects and functions.
A declaration of a type, object or function tells the compiler that a name exists and how it may be used, and so may be referred to later in the file. If the compiler encounters a name that does not have a preceding declaration, it may generate an error or a warning because it does not understand how the name is to be used.
In contrast, a Java compiler can look forward or back, or even into other source files, to find definitions for referenced names.
A definition of an object or function tells the compiler which module the object or function is in (see Program modularity). For an object, the definition may also indicate its initial value. For a function, the definition gives the function's behaviour.