Hola Luis Mario,<br><br><div class="gmail_quote">2010/11/2 Luis Mario Niedas Hernández <span dir="ltr"><<a href="mailto:adarias@estudiantes.uci.cu">adarias@estudiantes.uci.cu</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola,buen día. Necesito que me ayuden a comprender el trabajo con punteros y sobre todo relacionado con las funciones. Me explico por ejemplo en la biblioteca string.h biene el prototipo de una funcion ejemplo :<br>
<br>
void *memcpy(void *s1, const void *s2, size_t n);<br>
<br>
Mis dudas son:<br>
1- Ques lo que devuelve esa función??<br>
Se vé que debe de ser un puntero, pero, me devuelve el valor o la direccion donde está el valor.<br>
<br></blockquote><div><br>Exacto. La función 'memcpy()' retorna un puntero a 'void', que típicamente llamamos "puntero genérico".<br><br>En el caso de 'memcpy()', ésta retorna 's1'.<br>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
2- Si fuese a asignarle el resultado a otro puntero como lo haria??<br>
<br>
Ejemplo de lo que quiero saber:<br>
<br>
  char *cadena, cadena_2;<br></blockquote><div><br>Casi. Debería ser:<br><br>char *cadena, *cadena_2;<br><br>o incluso,<br><br>char *cadena;<br>char *cadena_2;<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

  cadena =  (char *)malloc(20);<br>
  cadena_2 =  (char *)malloc(20);<br>
<br>
  // de esta manera<br>
  cadena = memcpy(cadena, cadena_2, 20);<br>
<br></blockquote><div><br>En general, esto es correcto, pero no es aconsejable modificar 'cadena' porque contiene la dirección de la memoria previamente adjudicada dinámicamente. No es bueno modificar punteros usados de esta manera.<br>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
  // de esta otra<br>
   memcpy(cadena, cadena_2, 20);<br></blockquote><div><br>Esto es lo usual.<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
  // o de esta<br>
  *cadena =  memcpy(cadena, cadena_2, 20);<br>
<br></blockquote><div><br>Esto es incorrecto. Recuerda que C y C++ son lenguajes FUERTEMENTE tipificados. Esto significa que los tipos de las entidades deben mantenerse y concordar en cualesquier operaciones involucradas.<br>
<br>'*cadena' significa que el tipo de 'cadena' debe ser un puntero. El resultado de esta operación es el tipo del dato apuntado, que en este caso es 'char'. Como la función 'memcpy()' retorna un puntero a 'char', tenemos la asignación:<br>
<br><char> = <char *><br><br>Como puedes ver, los tipos no concuerdan y como tampoco existe una regla semántica que convierta un 'char *' a un 'char', entonces la sentencia es incorrecta.<br><br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">en fin que no sé como puedo concatenar una cadena con otra.<br>
<br></blockquote><div><br>Si se trata de cadenas, entonces sugiero usar 'strcpy()' o incluso, 'strncpy()' para copiar cadenas de caracteres. Para encadenar, usa 'strcat()' o 'strncat()'. Por ejemplo,<br>
<br>char cad1[] = "hola";<br>char cad2[] = "mundo";<br>char resultado[20] = "";<br><br>strncat( strcat( strcpy( resultado, cad1 ), " " ), cad2, 20 );<br><br><br>Espero que esto te aclare las dudas.<br>
<br>Steven<br><br></div></div>