UN*X allows file access from directories, which attach filenames to inodes (or vnodes, if you've been spoiled by NFS and later weenie file systems). The connection filename ⇒ inode is the "hardlink". A "file" (really, an inode, as we've just seen!) can have filenames in multiple directories.
You create a hardlink either by creating a file, or by saying "
ln a b", which creates "b" as a filename pointing to the same inode that "a" points to. You could now even say "rm a", "safe" in the knowledge that b still holds your file. You could even write "mv" in this way (apart from inode limits).
Clearly, hardlinks are UN*X's gift to the Klingon programmer.
You cannot have a hard link to a directory in most UNIXen today. This is widely considered a Good Thing: it could badly break directory-traversing programs, except those written by Klingon programmers for non-Klingons. Even if you could, these Klingon-written directory-traversing programs could detect this by examining the inode of .. in every directory they enter, refusing if that inode doesn't match the inode of the directory through which they're entering. Sure, they'd miss some directories (and consequently presumably have to kill themselves), but they wouldn't enter an infinite loop (and consequently have to kill -9 their programmer). Of course, such a shameful program could be fooled, creating directories it can never enter (except when started from), by saying
% mkdir a
% ln a b
% rmdir a
You can always put symbolic links to a directory, though. Symlinks are for weenies. Well, they would be, except that they're far more useful.