Hola:
Un string es una cadena, o sea una consecusion de caracteres que terminan con un carracter especial llamado fin de string.
En C y C++ el string como tipo de dato no existe, ya que se hace incapié en la asignación de memoria de tamaño fijo para un dato, siendo el tipo string un tamaño variable.
Entonces para usar una cadena en C y C++ se hace de diferentes formas, o declarando en forma estática la cantidad de caracters de un arreglo que se usará como contenedor de ese string, lo que se hace de la forma char string[tamañofijo]; disponiendo asi de la capacidad de recibir una cadena de caracteres, incluyendo espacios de valor fijo -1, ya que el ultimo caracter es el fin de string '\0'
Esta forma, preasigna un lugar en la memoria se llene o no y que se ocupa en todo el transcurso del programa, generalmente se declara bajo los archivos de cabecera, para ser compartido por todas las funciones sin tener que hacer engorrosos pasajes de terminos.
La otra forma estática, es definiendo un puntero y una sucesión de elementos del mismo tipo en orden consecutivo de la forma char *string={"Mi mamá me mima"} ó por caracter char *string=['m', 'i', ' ', 'm', 'a', 'm', 'á', ' ', 'm', 'e', ' ','m', 'i', 'm', 'a'} ; con lo que se le asigna un tamaño que es el de la cadena de carqacters +1 admitiendose en algunos compiladores el puntero como vector nulo char string[]= {"mi mama me mima"};
En todos los casos, se puede individualizar una posición en el vector por su indice que arranca de 0 hasta encontrar el caracter de fin de string.
La ventaja de declarar el vector por su contenido, es que el espacio asignado se ciñe al ocupado, y esto es util para ahorrar memoria cuando el string es algo que no se debe llenar ni cambiar durante el programa.
La otra forma de declaración, es la dinámica, la que se hace en la ejecución del programa mediante un operador de asignacion de memoria, como el malloc o calloc en C y el new en c++ aunque tambien se pueden usar los primeros, no se usan por su mas complicada declaración.
Para crear un vector en forma dinámica, lo primero es crear un puntero del mismo tipo de dato, luego mediante new asignarle la cantidad de memoria segun la cantidad de caracteres que pensamos poner
char *p
p= new char[30];
de esta manera, tenemos un vector creado dinamicamente para 29 caracteres mas 1 de fin de string para una cadena, que si usamos y ya no lo necesitamos, liberamos el espacio ocupado en la memoria mediante delete(p); y mediante free para los antiguos asignadores malloc y calloc
Ventaja, no ocupar memoria para algo que no se usará mas durante el programa, complicacion: que el vector se crea privado en el ambito donde se creó, y que para acceder a él, hay que hacer pasajes de terminos entre la función o el main y el ambito donde se creó, y eso lo complica bastante.
En el caso, de que se quiera analizar por ejemplo de un texto de 10000 caracteres la cantidad de espacios, ó vocales o cuantas veces se repite una cosa o la otra, esto es lo mas adecuado, ya que se crea el vector, se llena desde el archivo que contiene el texto se analiza y solo se pasan las conclusiones de lo que se quería hacer con el vector, luego borrandolo para desocupar la memoria, esto hace que cuando creamos una funcion debemos tener en cuenta que vamos a devolver o si vamos a pasar resultados mediante variables globales, ya que no contaremos con el vector para un posterior análisis.
La libreria string.h permite operar con las cadenas (los string) de manera sencilla, aunque no es una libreria económica en ocupar recursos ya que tiene que hacer basante trabajo para una sola orden, que se puede desarrollar mediante stdio.h sin muchas complicaciones
Este archivo de cabecera (el stdio.h) mediante sprintf(destino, formato, contenido); permite manipular las cadenas con la misma sencillez que maneja los flujos (stream) para acceder a archivos de disco y como consume mucho menos recursos hace que nuestro programa corra más rápido (cosa que se nota cuando la cantidad de procesos a realizar es muy grande), pero sobre todo, porque permite ver el proceso por el cual se hace paso a paso lo que se busca, lo cual mantiene despierto el espiritu de la programacion, (cosa a la que no contribuye el mas alto nivel de programación, ya que perdemos nocion de lo que se hace y como se hace).
Por ejemplo, para saber la longitud de carateres ocupados de una cadena, mediante la libreria string.h tenemos la orden length(cadena) que devuelve un entero que es la cantidad de caracteres de relleno sin contar el fin de string, sin la libreria, basta hacer un for despues de llenada la cadena mediante gets(string); de stdio.h y recorrerla desde 0 hasta que cuando encuentre el caracter de fin de string, el valor en que queda la variable del for es la cantidad de caracteres que tienen la cadena
for(i=0; y<100; i++) if(strin[i=='\0') break;
para toda funcion de la libreria string, se puede hacer mediante un no muy extenso codigo usando lo estandar, por lo que yo aconsejo, que se haga de la ultima forma, por los motivos que antes enuncié.
Saludos
Antonio