char *[] is read as an array of pointers to char. Generally, a pointer to char represents a a pointer to a null terminated string. This is by convention, and when you pass a char * to a routine, like cout, it will print all the characters that the char * points to until it reaches a null.
So, argv[0] points to a memory address starting with the char '.', which has after it more characters until it reaches the null termination: "./program\0". The cout routine which handles char * will print each character until the null.
When you "dereference" a pointer to char, as in *argv[0], you are asking to return the item that the argv[0] points to. In this case, * (char *) is saying return to me the character that is being pointed to by the (char *). The type of this item is a char, aka a single character. The cout routine which prints char (and not char * this time) is instead called, and it prints just that character that is being pointed to. In the above case, that is a '.'.