C ++ Primer Plus Notes 3 (Capítulo cuatro puntos)

 El operador * delante del puntero se denomina valor indirecto o operador de desreferencia.

1. Declaración de puntero en C ++ : int * ptr; // Enfatice que int * es un puntero de tipo a int . ptr en sí mismo es un puntero

                                int * p1, p2; // Declara un puntero p1 y una variable int p2.

2. ** Inicialización del puntero : ( no para inicializar el valor al que apunta ) int h = 5; int * pt = & h; [La inicialización del puntero es muy importante] (eliminar pt; // no permitido)

    La siguiente declaración: largo * compañero; * compañero = 23323; // Se producirá un error, es imposible determinar a dónde apunta el compañero y puede que no apunte al lugar donde se almacena 23323

3. El puntero no es un número entero: int * pt; pt = 0xB8000000; // Ilegal 

                               int * pt; pt = (int *) 0xB8000000; // legal

4. Utilice la función de biblioteca malloc () para asignar memoria en C. Lo mismo se puede hacer en C ++. Hay otro método: el nuevo operador. new y delete deben usarse en pares

  int * pn = new int; .... delete pn; // Use delete para liberar la memoria asignada por new

double * pd = new double; * pd = 10000001.0; // tamaño de pd = 4, tamaño de * pd = 8, la longitud del puntero es de 4 bytes, no tiene nada que ver con el tipo de datos puntiagudos

5. Utilice nuevo para crear una matriz dinámica:

double * p3 = new double [3];   // Crea una matriz que contiene 3 elementos dobles , el puntero p3 apunta al primer elemento en la memoria

p3 [0] = 0.2; p3 [1] = 0.5; p3 [2] = 0.8; // Acceso del puntero a los elementos de la matriz

p3 = p3 + 1; cout << p3 [0] << "" << p3 [1]; // El resultado de salida es que p3 [0] es 0.5 y p3 [1] es 0.8. p3 + 1 hace que el puntero apunte al segundo elemento.

p3 = p3-1; delete [] p3;   // Cuando se suelta el puntero, se debe disminuir en 1, apuntando al valor original. Agregue [] al liberar memoria de matriz

6. Después de que la variable de puntero se incrementa en 1, el incremento es igual al número de bytes del tipo al que apunta.

En la mayoría de los casos, C ++ interpreta el nombre de la matriz como la dirección del primer elemento de la matriz.

Cuando se usa la notación de matriz, C ++ realiza la siguiente conversión: matriz [i] -> * (matriz + i)

Se usa el puntero en lugar del nombre de la matriz. C ++ también realiza la conversión: pt [i] -> * (pt + i) 

7. Aplique sizeof a la matriz para obtener la longitud de la matriz, aplique sizeof al puntero para obtener la longitud del puntero (= 4);

8. Dirección de matriz

short tell[10];  

cout<<tell<<endl;  //显示&tell[0]的结果,是一个2字节的内存块地址

cout<<&tell<<endl; //对数组名取地址(&)显示整个数组的地址,是一个20字节的内存块地址

//tell是一个short指针 *short
//&tell是一个指向包含20个元素的short数组的指针 short(*)[20]

short (*pas)[20]=&tell; //pas指针指向含20个short元素的数组
//*pas等价于tell, (*pas)[0]=tell[0];

9. Si proporciona un puntero a cout, imprimirá la dirección, si el tipo de puntero es char *, cout mostrará el carácter al que apunta.

   Si desea mostrar la dirección de la cadena, debe convertir (int *) ps.

 char animal [20] = "zorro"; char * ps;

ps = animal; cout << ps << "at" << (int *) ps << endl; // ps es un puntero, pero muestra una cadena, (int *) ps muestra la dirección de la cadena

10. Obtenga una copia de la matriz de cadenas usando new y strcpy ()

  ps = new char [strlen (animal) +1];   

  strcpy (ps, animal); // No se puede asignar directamente, ps = animal, solo quiero copiar la dirección a ps, los dos punteros apuntan a la misma unidad de memoria y cadena, no se copia ninguna cadena.

11. Cuando se usa new para crear una estructura dinámica, el puntero pa representa un puntero a la estructura y la forma de acceder a los miembros de la estructura: (1) pa-> nombre; (2) (* pa) .name [el nombre es un miembro de la estructura]

12. 

struct Years
{
 int year;
 int month;
};
Years y1,y2,y3; //创建结构变量
Years ys[3];    //创建结构数组


const Years * apy[3]={&y1,&y2,&y3};  //创建指针数组

//创建上述指针数组的指针,两种方式
 const Years ** ppya=apy;   //方法1
 auto ppyb=apy;             //方法2,方便一点,不易搞混
//访问
std::cout<<(*ppya)->year<<std::endl;
std::cout<<(*(ppyb+1))->yrar<<std::endl;

13. Clase de plantilla de clase de vector (matriz dinámica)  : la aplicación es para agregar archivos de encabezado #include <vector>;

using spacename std;    vector <int> vi (n); // Un objeto vectorial llamado vi, que puede almacenar n elementos de tipo int, n puede ser una constante entera o una variable entera

14. La aplicación de clase de matriz de clase de plantilla  (C ++ 11) es para agregar archivos de encabezado #include <array>; Como los arreglos, los objetos de arreglo tienen una longitud fija.

using spacename std;    array <int, 5> ai; // Un objeto de matriz llamado ai, que puede almacenar n elementos de tipo int, n es una constante entera., aquí n = 5;

15. Las matrices, los objetos de matriz y los objetos vectoriales pueden utilizar la notación de matriz estándar para acceder a cada elemento.

El objeto de matriz puede asignarse directamente a otro objeto de matriz y, para una matriz, los datos deben copiarse elemento por elemento.

Los objetos de matriz y las matrices se almacenan en la misma área de memoria (es decir, pila), los objetos vectoriales se almacenan en otra área (área de almacenamiento libre o montón).

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/lvliang2017232003/article/details/85341687
Recomendado
Clasificación