Magic C ++ - puntero
Prefacio
Los estudiantes que han estudiado C ++ o C pueden saber que lo más diferente entre ellos y Java y Python es que tienen punteros avanzados y poderosos.
Cuando estaba leyendo el libro hoy, volví a ver el contenido del puntero y me acordé de registrarlo y, más o menos, llevar un registro. Agregaré los incompletos más tarde
concepto
El puntero es una variable especial, el valor almacenado en él se interpreta como una dirección en la memoria . La dirección apunta a una parte de la memoria, que se puede utilizar para almacenar datos. ¿Qué datos? Para ser razonables, siempre que sean datos, se pueden almacenar, int, long, char, double, structure, class ...
Por lo tanto, puede tratar los punteros como algo indicativo y hacer referencia a la dirección de almacenamiento en sí , como una clave, la dirección apunta a Datos importantes es como un granero.
Pero no se puede decir que el puntero no sea importante, ¿cómo puede la clave no ser importante, entonces es importante ?
Primer conocido
Usemos un ejemplo simple para conocer el puntero
#include<iostream>
using namespace std;
int main()
{
int donuts=6;
int* dp=&donuts;
cout<<"dp="<<dp<<" *dp="<<*dp<<endl;
return 0;
}
Como resultado, podemos
ver que el puntero dp apunta a la variable donuts, más esencialmente, apunta a la dirección del bloque donde se almacena 6, que es la cadena larga de direcciones después de dp =.
Aquí está el símbolo de valor, saque la dirección de las rosquillas y asígnela a dp; * dp aquí * es desreferencia, lea los datos almacenados en la memoria apuntada por el puntero.
En este pequeño ejemplo, básicamente puede ver el uso de punteros, cómo declararlos y cómo usarlos.
Nota: aquí int * significa un puntero de tipo int. Aunque los punteros almacenan direcciones de 64 bits (en sistemas operativos de 64 bits), para distinguir los tipos de datos a los que apuntan, deben distinguirse
declaración
Ya sabía un par de cosas cuando me conocí. Ahora hablemos de ello formalmente.
Dado que la computadora necesita rastrear el tipo de valor al que apunta el puntero , como algún punto a int y algún punto a char, debe distinguirse según el valor interno.
Por ejemplo, necesito varias llaves, varios graneros, las llaves son iguales, pero necesito distinguir, esto es para abrir el granero, esto es para abrir el silo de frijoles, etc.
Así llamado:
escriba * nombre
Escribir reglas
Lo que quiero explicar aquí es que los espacios en ambos lados del operador * son opcionales. Tradicionalmente, los programadores de C usan:
int *ptr;
Se enfatiza que * ptr es un valor de tipo int
y los programadores de C ++ usan este formato más:
int* ptr;
Se enfatiza que int * es un puntero de tipo a int.
Donde agregar espacios, no hace ninguna diferencia para el compilador, incluso
int*ptr;
Pero hay una cosa a tener en cuenta:
int* p1,p2;
Con este nombre, p1 es un puntero, pero p2 es un int.
Es decir, cada nombre de variable de puntero debe usar un *
inicialización
Se puede inicializar en el momento de la declaración, pero una cosa para recordar es: el puntero se inicializa, no el valor al que apunta
int higgens=5;
int* pt=&higgens;
Aquí se establece el valor de pt (no * pt) en & higgens
ejemplo:
#include<iostream>
using namespace std;
int main()
{
int higgens=5;
int* pt=&higgens;
cout<<"higgens的值为:"<<higgens
<<"; higgens的地址为:"<<&higgens<<endl;
cout<<"*pt的值为:"<<*pt
<<"; pt的值为:"<<pt<<endl;
}
Salida:
se puede ver que pt se inicializa en la dirección de higgens
El peligro de los punteros
Necesitamos recordar el punto extremadamente importante: cuando C ++ crea un puntero, la computadora asignará la memoria utilizada para almacenar la dirección, pero no asignará la memoria utilizada para almacenar los datos apuntados por el puntero . Proporcionar espacio para los datos es un paso independiente.
como:
long* fellow;
*fellow=23333;
A primera vista, no hay problema, pero si lo piensas, verás que
Fellow es de hecho un puntero, pero ¿a dónde apunta? Dado que no hay inicialización, el sistema le asignará aleatoriamente una dirección , que puede ser la dirección del código del programa o la dirección de los datos, por lo que una vez que se manipula, es probable que cause un gran problema.
Este es un problema muy serio, ¡así que tenga cuidado!
Eso es todo por hoy, y lo agregaré más tarde ~