constおよびnon-const型の割り当ての問題

constおよびnon-const型の割り当ての問題

以前は、const charからcharへの割り当てが間違っていて、const intからintへの割り当てに問題がなかったという、私には理解できない問題が常にありましたはは、私と同じ質問をしている初心者は他にいるのだろうか?幸いなことに、私は幸運でした。それが今日の私のインスピレーションをどのように引き起こしたのかわかりませんでした。そしてついにこの小さな白い質問を理解しました。答えは:

const intからintへの代入演算はオブジェクトのコピーです。もちろん、代入後のオブジェクトのコピーを操作しても問題ありません。const charからcharの代入演算もオブジェクトのコピーですが、コピーするのはポインタオブジェクトのみであり、ポインタが指すオブジェクトは同じコピーです。代入の前​​後でこのオブジェクトのタイプが変更されます。 、およびコンパイラは当然エラーを報告します。さらに、char * constからchar *への割り当ては、ポインターオブジェクトの単なるコピーであり、ポインターは同じタイプのオブジェクトを指しているため、コンパイラーはエラーを報告しません。

constとnon-constの間で相互に値を割り当てる場合、不適切な使用はいくつかの問題を引き起こす可能性があります。

非ポインタ型

  • 非ポインタ型
const int c_A = 10;
int b = 20;

b = c_A ; // 正确
c_A = b; // Error!
  • 理由:
    1:この問題に関して、const変数に非const変数を割り当てることは違法であるというインターネット上の発言があります。この簡単に混乱する論理に陥らないでください。
    2:上記の状況、より正確な説明。const intは、初期化後に変更することはできません。また、constintは宣言時に割り当てる必要があります。
// Error
const int c_A;
c_A = 10;

ポインタ型

const int* c_PtrA  =  new int(10);
int * ptrB= new int(10);

c_PtrA = ptrB; // 没问题
ptrB = c_PtrA; // 编译报错 不能从 const int* 转换程 int*

// 下面这种情况不会报错,但可能造成程序崩溃
ptrB = (int*)c_PtrA;
// ....
*ptrB = 20; // 此处修改了b和a共同指向的地址的内容,程序崩溃

  • 理由:
    1。constint *は、定数int型へのポインタ、つまり、ポイントされたメモリの内容を変更できないことを意味します。(ただし、ポインター自体は変更できます)。
    2. int *は、非定数int型へのポインターを意味し、ポインターの内容を変更でき、ポインター自体を変更できます。
    3. const int *はこのアドレスの内容を制限しており、変更できません。このとき、int *ポインターがこのアドレスを指すようにし、int *ポインターを使用して、アドレスの内容を変更できることを示します。変更できますか?
    4.接続されているため、ロジックが競合しているため、コンパイラはエラーを報告します。
// 正确
const int * c_A;
// ...
c_A = someAddress;

1.したがって、非ポインタ型constの場合、定数である「const」を使用していると理解できます。定数とは何ですか?10、20、「linduo」などはすべて定数です。Int a、charsなどはすべて変数です。
2.ポインタ型の場合、もちろん定数ポインタとポインタ定数には違いがあります。「const」の使用は、ポインタ自体またはポインタがコンテンツを指すかどうかを制限するために使用されることが理解できます。

おすすめ

転載: blog.csdn.net/baidu_38410526/article/details/102679685