gcc looks for standard header files, e.g. stdio.h and stdlib.h, by default in the /usr/include system directory. You can override this (but there's no need to) with the --sysroot option.
As far as your header files are concerned, you can store them anywhere you like, provided you tell gcc where to find them when you compile your program/modules.
Say you have a program, hello.c, in your home directory /home/keeler, and you have written a header file hello.h which you store in /home/keeler/include, plus you want to include another header, zorro.h, which is in /usr/src/kernels/2.6.18-1.2849.fc6-i686/include/linux.
To compile the program, you'll specify
gcc -I ./include -I /usr/src/kernels/2.6.18-1.2849.fc6-i686/include/linux -o hello hello.c
Naturally, the program will also contain #includes of standard headers like stdio.h and stdlib.h, but you don't have to specify where to find those, provided the ones you want to include are the ones in /usr/include, as this is the standard path where the compiler will look for them.