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.