Magic C ++ - puntero

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
Inserte la descripción de la imagen aquí
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:
Inserte la descripción de la imagen aquí
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 ~

Supongo que te gusta

Origin blog.csdn.net/rjszz1314/article/details/104255071
Recomendado
Clasificación