buenas tardes amigos, dado este sencillo codigo tengo las siguientes dudas:
1) porque al mostrar en pantalla el valor apuntado hacia un vector, no se referencia al puntero? (es decir, no escribo el * cuando hago
printf("valor...... %s ", (char*)punt);
y cuando lo hago con una variable tipo INT si
printf("el valor.... %i\n", *(int*)punt);
2) porque no puedo tomar la direccion especifica cuando apunto a una direccion dinamica?
(es decir, no puedo hacer
printf("valor de la memoria: %i", &punt[1]);
)
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
void *punt;
punt = malloc(20 * sizeof(char));
strcpy(punt, "hola mundo\n");
printf("el valor al que apunta es: %s \n", (char*)punt); //aca no se referencia
printf("direccion de memoria..: %d\n",&punt);
free(punt);
punt = malloc(sizeof(int));
*(int*)punt = 1;
printf("el valor apuntado es: %i\n", *(int*)punt); //aca si se referencia el puntero
printf("direccion de memoria..: %d\n",&punt);
printf("direccion de memoria..: %d\n",&punt[1]);//porque esto no se puede
printf("direccion de memoria..: %d\n",&punt[2]);
printf("direccion de memoria..: %d\n",&punt[3]);
free(punt);
return 0;
}
1) punt ya es un puntero a la cadena ( en ese ejemplo ) además de eso printf con el formato %s toma en cuenta que el parametro pasado
es una cadena y por ende lo tratara como tal, esto es asunto interno de printf no te confundas.
2) El problema es que es de tipo void* no sabe el tamaño de cada elemento que apunta a void* puede ser de tipo
IMAGE_NT_HEADERS,DWORD,etc. y los tamaños son totalmente diferentes, si haces un casting a algun tipo veras que si se puede.
Y además printf tiene el %p para mostrar direcciones de memoria:
http://www.cplusplus.com/reference/cstdio/printf/