2009-05-22 24 views
8

¿Se puede asignar un puntero a un valor en la declaración? Algo como esto:Inicializando punteros en C++

int * p = &(1000) 
+4

¿Está tratando de establecerlo en una dirección absoluta, es decir, en un sistema integrado?Hace una gran diferencia en la respuesta. –

+1

De hecho, es difícil adivinar lo que estás buscando ... Supongo que eres nuevo en los indicadores y confundes los términos verbales, bueno ... Todo el mundo tiene que empezar en alguna parte. :-) –

Respuesta

22

Sí, puede inicializar punteros a un valor en la declaración, sin embargo no se puede hacer:

int *p = &(1000); 

& es la dirección de operador y no se puede aplicar eso a una constante (aunque si pudiera, eso sería interesante). Intente utilizar otra variable:

int foo = 1000; 
int *p = &foo; 

o el tipo de fundición:

int *p = (int *)(1000); // or reinterpret_cast<>/static_cast<>/etc 
+2

¿Las constantes de cadena son un caso especial? Aunque eso tendría que ser un "const char *" ... – dmckee

+3

Sí, los literales de cadena son especiales en que son expresiones lvalue, refiriéndose a un objeto de matriz (no a un puntero). Entonces puedes hacer 'char const (* p) [3] = &"01";' No menos interesante es inicializar una const * como esta: 'char const * p = & "hello there" [0];' –

+0

no funciona, lo intenté, pero muestra algún valor de tipo de basura. ** 'int * p = (int *) 100;' **. entonces la salida es algo así como ** '000003E8' ** – Ravi

2

Um. No creo que puedas tomar una dirección no constante de una constante como esa.

pero esto funciona:

int x = 3; 
int *px = &x; 
cout << *px; // prints 3 

o esto:

const int x = 3; 
const int *px = &x; 
const int *pfoo = reinterpret_cast<const int*>(47); 
4

¿Qué hay de:

// Creates a pointer p to an integer initialized with value 1000. 
int * p = new int(1000); 

probado y funciona. ;-)

+3

¡Pero no olvides eliminarlo! – GManNickG

7

Hay dos cosas que no están claras en la pregunta para mí. ¿Desea establecer el puntero a un valor específico (es decir, la dirección), o desea hacer que el puntero apunte a alguna variable específica?

En este último caso, puede utilizar simplemente el operador de dirección de. El valor del puntero se establece en la dirección de some_int_variable.

int *p = &some_int_variable; 
*p = 10; // same as some_int_variable = 10; 

Nota: Lo que sigue es cambiar el mal del valor del puntero de forma manual. Si no sabe si quiere hacer eso, no quiere hacerlo.

En el primer caso (ajuste es decir a algunos, dirección específica dada), no se puede simplemente hacer

int *p = 1000; 

Dado que el compilador no se llevará a la int e interpretarlo como una dirección. Tendrá que indicar al compilador que debe hacerlo de forma explícita:

int *p = reinterpret_cast<int*>(1000); 

Ahora, el puntero hará referencia a algún entero (con suerte) en la dirección 1000. Tenga en cuenta que el resultado es definido por la implementación. Pero, sin embargo, esa es la semántica y esa es la forma en que le cuentas al compilador al respecto.

actualización: El Comité fija el comportamiento extraño de reinterpret_cast<T*>(0) que fue sugerido por una nota y para el que he proporcionado una solución antes. See here.