Te dejo un extracto del excelente libro 
El Lenguaje de Programación C de 
Brian W. Kernighan y Dennis M. Ritchie (los creadores del lenguaje) traducido de la segunda edición en inglés. Esta es una edición en español de 
1991 editada por 
Prentice-Hall Hispanoamericana, S. A. Lo dicho ahí funciona para cualquier compilador de C/C++, no importando el sistema operativo en que lo estés usando. Espero que te sirva.
5.10 Argumentos en la línea de órdenes
   Dentro de un medio ambiente que maneje C hay una forma de pasar argumentos en la línea de órdenes o de parámetros a un programa cuando empieza su ejecución. Cuando se llama a 
main se le invoca con dos argumentos. El primero, llamado por convención 
argc (por "argument count") es el número de argumentos en la línea de órdenes con los que se invocó el programa; el segundo 
argv (por "argument vector") es un apuntador a un arreglo de cadenas de caracteres que contiene los argumentos, uno por cadena. Se acostumbra a utilizar niveles múltiples de apuntadores para manipular esas cadenas de caracteres.
   El ejemplo más sencillo es el programa 
echo, que despliega sus argumentos de la línea de órdenes en una línea, separados por blancos. Esto es, la orden
echo hola, mundoimprime
hola, mundo   Por convención, 
argv[0] es el nombre con el que se invocó el programa, por lo que 
argc es por lo menos 1. Si 
argc es 1, entonces no hay argumentos en la línea después del nombre del programa. En el ejemplo anterior, 
argc es 3, y 
argv[0], argv [1] y 
argv[2] son 
echo, hola y 
mundo, respectivamente. El primer argumento optativo es 
argv[1] y el último es 
argv[argc-1]; además, el estándar requiere que 
argv[argc] sea un apuntador nulo
La primera versión de 
echo trata a 
argv como un arreglo de apuntadores a caracteres:
 
#include <stdio.h>
/* eco de los argumentos de la línea de órdenes; 1a. versión */
main (int argc, char *argv[])
{
  int i;
 
  for (i = 1; 1 < argc; i++)
    printf ("%s%s", argv[i], (i < argv-1) ? " ": "");
  printf ("\n")
  return 0;
}
 
 
Como 
argv es un apuntador a un arreglo de apuntadores, se pueden manipular al apuntador en lugar de indexar al arreglo. Esta siguiente variación se basa en incrementar 
argv, que es un apuntador a un apuntador a 
char, en tanto se disminuye 
argc:
 
#include <stdio.h>
 
/* eco de los argumentos de la línea de órdenes; 2a. versión */
main (int argc, char *argv[])
{
  while (--argc > 0)
    printf ("%s%s", *++argv, (argc > 1) ? " ": "");
  printf ("\n");
  return 0;
}
 
 
Puesto que 
argv es un apuntador al inicio del arreglo de cadenas de argumentos, incrementarlo en 1 (
++argv) lo hace apuntar hacia 
argv[1] en lugar de apuntar a 
argv[0]. Cada incremento sucesivo lo mueve al siguiente argumento; entonces 
*argv es el apuntador a ese argumento. Al mismo tiempo, 
argc disminuye; cuando llega a cero, no quedan argumentos por imprimir.
   En forma alternativa, podemos escribir la proposición 
printf como   
printf ((argc > 1) ? "%s" : "%s", *++argv);Esto demuestra que el argumento de formato de printf también puede ser una expresión.