Registro de dificultades de aprendizaje de C ++

1. Puntero y dirección

Depurando en VS, los comentarios en el código son el resultado de la depuración.

#include <iostream>
using namespace std;

int main()
{
    
    
	int a = 10;//a 的地址0x00D7FBD0  a的值是10;
	int* b = &a; //b 的地址0x00D7FBC4, b的值是a的地址
	return 0;
}

En la memoria, la variable arepresenta la dirección de un determinado bloque y la variable se almacena en su interior. &Tomando el símbolo de dirección, puede tomar la dirección del lvalue, declarar una variable de puntero, puede almacenar el valor de dirección que obtiene, por supuesto, también puede conocer la dirección del puntero, pero en muchos casos no es necesario.
Ejemplo de imagen
2. La primera dirección de la matriz y la dirección del nombre de la matriz.

Inserte la descripción de la imagen aquí
Comprobamos que a, & a, & a [0] tienen el mismo valor.

  • De hecho, los resultados de ay & a son ambos la primera dirección de la matriz. Pero sus tipos son diferentes.

  • a significa & a [0], es decir, toma la dirección del primer elemento de la matriz. a + 1, que es & a [1].

  • & a Aunque el valor es la dirección del primer elemento de la matriz. Pero el tipo es: tipo (*) [número de elementos de la matriz], por lo que el tamaño de & a + 1 es: primera dirección + tamaño de (a).
    Tome el código anterior como ejemplo, podemos marcar & a + 1, el contenido apuntado es la primera dirección después de [4].
    Inserte la descripción de la imagen aquí

Cuando comprenda que el nombre de la matriz es la primera dirección de la matriz, también debe saber que el nombre de la matriz es simplemente "equivalente" a un puntero, no realmente un puntero. El
nombre de una matriz es solo una constante (un valor para el primer elemento de la matriz) Dirección constante), por lo que ++ no se pueden realizar operaciones o. La constante no puede tomar la dirección, y la razón del & a, de hecho, el significado de aquí ya no es el nombre de la matriz original, representa la matriz completa en este momento.

#include<stdio.h>
#include <iostream>

using namespace std;

int main()
{
    
    
    int a[5]={
    
    0x11121314,0x21222324,0x31323334,0x41424344,0x51525354};
    printf("%p\n%p\n",a,&a); //数值相等
//输出为  00AFFA5C  00AFFA5C
    cout<<sizeof(a)<<endl; // a是复合类型 int[5] 
// 输出20
    cout<<sizeof(&a)<<endl; // &a是int(*)[5]
// 输出4

    cout<<sizeof(a+1)<<endl; // a+1 变成指向数组第二个元素的指针,其类型是 int *    
//输出4
    cout<<sizeof(&a+1)<<endl; // &a+1 还是 int(*)[5]。类型还是指针   
//输出4

    //a+1 由于 a 指向int(但不是普通指针),加1移动int个大小
    //&a+1 由于 &a 指向 int[5],加1移动 int[5] 个大小
    printf("%p\n%p\n",a+1,&a+1);
//00AFFA60(00AFFA5C+4)   00AFFA70(00AFFA5C+5*4)
}

Registro, por lo anterior sabemos que se puede acceder a los nombres de las matrices como punteros hasta cierto punto, por lo que existen algunas dudas, entonces cuál es la diferencia entre los nombres de clases, estructuras y tipos de datos comunes.

#include <iostream>
#include <stdio.h>
using namespace std;

struct stu{
    
    
    int age;
    char b;
};
class A{
    
    
public:
    int aa;
    int ss;
    A(int a, int s):aa(a),ss(s){
    
    }
    void set(){
    
    
        cout << "hello world" << endl;
    }
};

int main()
{
    
    
    A aaa(7,3);
    A* ccc = &aaa;
    printf("%p\n", aaa);
    printf("%p\n", &aaa);
    printf("%p\n", ccc);

    cout << endl;
    int f = 7;
    printf("%p\n", f);
    printf("%p\n", &f);
    
    cout << endl;
    stu s;
    s.age = 7;
    s.b = 'a';
    printf("%p\n", s);
    printf("%p\n", &s);
    stu* sz = &s;
    printf("%p\n", sz);

    cout << endl;
    int a[10] = {
    
    0};
    int* b = a;
    printf("%p\n", a);
    printf("%p\n", &a);
    printf("%p\n", b);
    return 0;
}

Inserte la descripción de la imagen aquí
A partir de los resultados anteriores, por el momento, podemos considerar clases, estructuras y tipos de datos comunes como una sola mirada, donde los nombres de clases y estructuras pueden tomar sus direcciones, y la dirección es la primera dirección correspondiente. El nombre de la matriz tiene cierto efecto y se puede utilizar como puntero.
Cuando c ++ escribe la lista enlazada, ¿los nodos generados por new deben liberarse
al final del programa ? No al final del programa, sino cuando ya no se necesita un nodo.
Por ejemplo, eliminar un nodo no solo lo elimina de la lista vinculada, sino que también lo elimina.
La razón de esto es porque si no lo borra manualmente, sabrá que seguirá ocupando memoria antes de que finalice el programa. Si es un programa grande, es posible que se quede sin memoria después de ejecutarse durante mucho tiempo.
No es necesario liberarlo cuando finaliza el programa, porque el sistema recuperará la memoria.

Supongo que te gusta

Origin blog.csdn.net/JACKSONMHLK/article/details/113527839
Recomendado
Clasificación