C ++の学習障害の記録

1.ポインタとアドレス

VSでのデバッグでは、コード内のコメントはデバッグの結果です。

#include <iostream>
using namespace std;

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

メモリ内では、変数aは特定のブロックのアドレスを表し、変数は内部に格納されます。&アドレスシンボルを取得すると、左辺値のアドレスを取得し、ポインタ変数を宣言し、取得したアドレス値を格納できます。もちろん、ポインタのアドレスも知ることができますが、多くの場合、必須ではありません。
画像例
2.配列の最初のアドレスと配列名のアドレス

ここに画像の説明を挿入
a、&a、&a [0]が同じ値であることを確認します。

  • 実際、aと&aの結果は、どちらも配列の最初のアドレスです。しかし、それらのタイプは異なります。

  • aは&a [0]を意味します。つまり、配列の最初の要素のアドレスを取得します。a + 1、これは&a [1]です。

  • &a値は配列の最初の要素のアドレスですが。ただし、タイプはtype(*)[配列要素の数]であるため、&a +1のサイズはfirstaddress + sizeof(a)です。
    上記のコードを例にとると、&a + 1を確認できます。ポイントされたコンテンツは、a [4]の後の最初のアドレスです。
    ここに画像の説明を挿入

配列の名前が配列の最初のアドレスであることを理解するときは、配列の名前が実際にはポインターではなく、ポインターと「同等」であることも知っておく必要があります。
配列名前は単なる定数です。 (配列の最初の要素の値)アドレス定数)、したがって++または-操作は実行できません。定数はアドレスを取ることができず、&aの理由は、実際、ここの意味は元の配列名ではなく、現時点では配列全体を表しています。

#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)
}

上記から、配列名はある程度ポインタとしてアクセスできることがわかっているので、いくつか疑問があります。クラス、構造、および一般的なデータ型の名前の違いは何ですか。

#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;
}

ここに画像の説明を挿入
上記の結果から、当面は、クラス、構造、および一般的なデータ型を一見したものと見なすことができます。クラスと構造の名前はそれらのアドレスをとることができ、アドレスは対応する最初のアドレスです。配列名には一定の効果があり、ポインターとして使用できます。
c ++がリンクリストを書き込むとき、newによって生成されたノード
は、プログラムの最後に解放する必要がありますか?プログラムの最後ではなく、ノードが不要になったときに解放する必要がありますか?
たとえば、ノードを削除すると、リンクリストからノードが削除されるだけでなく、ノードも削除されます。
これは、手動で削除しないと、プログラムが終了する前にメモリを占有し続けることがわかっているためです。大きなプログラムの場合、長時間実行するとメモリが不足する可能性があります。
システムがメモリを再利用するため、プログラムの終了時にリリースする必要はありません。

おすすめ

転載: blog.csdn.net/JACKSONMHLK/article/details/113527839