Kohlrak, you're giving terribly wrong advice in some places, so let me elaborate.
First, the declaration of printf is incorrect, because it uses a variable length argument list. Doesn't matter much, though.
printf(a); // Prints a 1 on the screen (or should)
As you yourself have written, the first argument is a pointer to a character constant. 'a' having the value of 1, you'd be printing out garbage data.
A short explanation of how data is handled in computers.
You've got a little amount of space in the CPU itself for variable storage, so you won't be able to process larger amounts of data simply by whacking it in the registers. That's why you have... RAM! That little rascal simply does one thing: you tell it where the piece of data you want is located, and it tells you what it is, in return.
So, usually data you'll be using will be referred to by an 'offset' or 'memory address'.
In C, this goes the following way: when you declare a variable, (int a), the compiler allocates memory for it, and remembers its memory address. Afterwards, you'll be able to refer to this data in memory simply by the variable name. This is clear so far, at least I hope so.

There are a few exceptions to this that you should note, namely arrays. Arrays are stored in the same way, except that the variable name (char array[80]) is the memory address where the data starts. Actually, the array variable isn't really variable, since you can't change its value. However, you can change the data at the memory address its pointing to. This is done by the dereference operator. (the *)
In short: you'll be working with memory addresses, that are automatically derefered, or in case of bigger data structures, you'll have to handle that as well.