2012-03-21 8 views
15

Por lo que sé Tipo de datos, al declarar una variable, necesitamos declarar su tipo de datos, que le dice al compilador que reserve el número de bytes en la memoria en consecuencia.¿Por qué se necesita el tipo de datos en la declaración del puntero?

Pero en caso de punteros, sabemos que su tamaño es siempre de 2 bytes (en Turbo compilador) siempre con independencia del tipo de datos de la variable que está apuntando.

Mi pregunta es, si los punteros siempre tienen 2 bytes, entonces ¿cuál es la necesidad de mencionar el tipo de datos mientras declarándolos? ¿O mi comprensión sobre los indicadores es incorrecta?

+1

¿Qué sentido tiene * no * especificar un tipo de datos? Si planea hacer algo con el puntero, necesita saber el tipo de datos al que apunta. – tenfour

+0

@Chandra: ¿Qué pasa con (vacío *)? – Malkocoglu

Respuesta

24

El tipo de datos es necesario al desreferenciar el puntero para que sepa la cantidad de datos que debe leer. Por ejemplo, al desreferenciar un puntero de char debería leer el siguiente byte de la dirección a la que apunta mientras que un puntero int debería leer 2 bytes.

+0

¡Esa es una gran respuesta! Finalmente lo he entendido. – Jeyekomon

+0

Explicación simple pero intuitiva. –

5

En primer lugar, el tamaño y la representación de los punteros en sí aren't always the same for different types. Es solo algo que sucede en muchas implementaciones.

En segundo lugar, al usar punteros, no le importa el tamaño de los punteros. Necesita el tamaño del tipo puntiagudo.

Por ejemplo, intente esto:

int var[5]; 
char *c = (char *)var; 
int *x = var; 

printf("%p\n%p\n", p + 1, x + 1); 

Verás aritmética de punteros depende en gran medida del tamaño del tipo de punta.

5

El problema no es sobre el tamaño del puntero sino la desreferenciación del puntero. (Carnero en C o C++)

Digamos que tienes:

int* someint; 
float* somefloat; 

*someint hace referencia a un tamaño de la memoria de sizeof(int), mientras que las referencias *somefloat un tamaño de memoria de sizeof(float) que son diferentes.

1

El tamaño que necesita un puntero depende del sistema que esté utilizando. En un sistema x86_64, el tamaño del puntero podría ser de 64 bits.

La razón por la que necesita el tipo de datos para los punteros es porque el compilador tiene que saber cuál es el tamaño de la celda de memoria, entre otros, al que apunta el puntero. Tampoco se puede garantizar la seguridad del tipo sin el tipo. Además, debería encasillar cada puntero al acceder a las estructuras desde el puntero.

También podría usar un puntero void y hacer todo a mano. Pero, ¿por qué querrías eso?

0

es el concepto de una tipificación fuerte utilizada en C++. el tamaño del puntero puede ser el mismo, pero el tamaño del tipo puntiagudo puede diferir. Sin embargo, siempre puede convertir un puntero de un tipo en un puntero de otro tipo.

1

asumir que este código se compila sin error (como le gustaría):

int a; 
int b = 42; 
void * d = &b; 

a = *d; 

¿Cuál debe ser el valor de una?

Ahora con éste:

int a; 
float b = 42.0; 
void * d = &b; 

a = *d; 

¿Qué esperas en una?

En realidad, el tipo especifica cómo se debe interpretar el área puntiaguda. Debe especificar int * en el primer ejemplo y float * en el segundo, en lugar de void *. Se necesita

+0

¿podría mostrar el resultado teórico de estos ejemplos? – Hoto

4

tipo de datos de un puntero en dos situaciones:

  1. Deferencing el puntero
  2. puntero aritmética

Cómo se utiliza en dereferencing el puntero?
Consideremos el siguiente ejemplo:

{ 
     char *k; //poniter of type char 
     short j=256; 
     k=&j; // Obviously You have to ignore the warnings 
     printf("%d",*k) 
    } 

Ahora ya k es de tipo char por lo que será de sólo lectura de un byte. Ahora valor binario de 256 es 0000000100000000 sino porque k es de tipo char por lo que será de sólo lectura primero byte por lo tanto, la salida será 0.
Nota: si asignamos j = 127 a continuación de salida será 127 porque 127 se mantienen por primer byte.

Ahora vienen a la aritmética puntero:
Consideremos el siguiente ejemplo:

{ 
     short *ptr; 
     short k=0; 
     ptr=&k; 
     k++; 
     ptr++;// pointer arithmetic 
    } 

son declaraciones k++ y ptr++ son lo mismo? No, k++ significa k=k+1 y ptr++ significa ptr=ptr+2. Como el compilador "sabe" que se trata de un puntero y apunta a un corto, agrega 2 a ptr en lugar de 1, por lo que el puntero "apunta al" siguiente entero.

Para obtener más información, consulte el segundo capítulo del tutorial this.

1

Los tipos de datos son necesarios simplemente para la verificación de tipos.

+0

En general, trate de dar respuestas que sean un poco más sustanciales. Tal vez intente incluir un ejemplo? – Nathan

Cuestiones relacionadas