。レッスン12古典問題解決(のconst;ポインタと参照)

質問1:constの読み取り専用変数?定数は何時ですか?

CONST定数の基準は:
。のみCONST初期リテラル定数はシンボルテーブル(直接初期化CONSTは定数である)を入力します
bは、他の変数を初期化するために使用される定数CONST変数は、読み取り専用で(間接的に初期化CONSTが残ります。読み取り専用の変数)
。cが外出するたびにその値が読み取り専用で、ここで変数.voaltile変数がcosnstを決めた(揮発性:.揮発性メモリシンボルテーブルに入りません修正揮発性定数のconstです。定することはできない。CONSTは、現在のスコープた図示されている、修飾された変数は、割り当ての左側に表示されることができない(読み取り専用))
一般的に:CONST識別子が直接コンパイル時に初期値を決定することができない、さこれは、読み取り専用の変数として扱われます

可変初期化CONST基準としてタイプ
同じタイプ:読み取り専用変数は、変数初期化
タイプ:読み取り専用の新しい変数(型タイプの左値)を生成します

#include <stdio.h>

int main()
{
    const int x = 1;            //常量
    const int& rx = x;          //只读变量
    
    int& nrx = const_cast<int&>(rx);
    
    nrx = 5;
    
    printf("x = %d\n", x);            //1 x被写到符号表中
    printf("rx = %d\n", rx);          //5
    printf("nrx = %d\n", nrx);        //5
    printf("&x = %p\n", &x);          //地址相同
    printf("&rx = %p\n", &rx);
    printf("&nrx = %p\n", &nrx);
    
    volatile const int y = 2;          //只读变量
    int* p = const_cast<int*>(&y);
    
    *p = 6;
    
    printf("y = %d\n", y);        //6
    printf("p = %p\n", p);           
    
    const int z = y;            //只读变量
    
    p = const_cast<int*>(&z);
    
    *p = 7;
    
    printf("z = %d\n", z);    //7
    printf("p = %p\n", p);
    
    char c = 'c';            
    char& rc = c;
    const int& trc = c;          //这里const引用的初始化时的类型与初始值类型不同,所以这里被定义成了一个新的只读变量。此时const int& trc = c;相当于给一个名为trc空间的内存赋值了‘c’。
    
    rc = 'a';           //修改不会影响到trc
    
    printf("c = %c\n", c);
    printf("rc = %c\n", rc);
    printf("trc = %c\n", trc);
    
    return 0;
}

質問2:との関係のポインタ参照は何ですか?理解する方法「を参照の性質をポインタ定数ですか」?

ポインタ:
ポインタは変数です。
初期化を必要としません。メモリアドレスの値は、異なるアドレスを保存することができます。
対応するメモリアドレス値へB.アクセスは、ポインタ
のC. CONSTポインタ定数または読取り専用変数になるように改変することができます。

参考文献は、
新しい名前を参照することは、単に変数です。
上の基準動作(割り当て、撮影アドレス)を表す変数に転送される
(CONSTが参照変数が読み取り専用である修飾が、一定のポインタが存在する)読み取り専用表されるすべての変数に対してb.const参照を
C.参照が定義されたとき、その後、他の変数を表現することはできません初期化する必要があります。

C ++言語の観点から、使用する
。参照ポインタをとは何の関係もありません
Bを。新しい参照変数名で、それは、動作基準変数に対応する動作であります

透視++コンパイラCからの
A。「参照」の新しい概念をサポートするためには、有効なソリューションでなければなりません
B。内部コンパイラでは、「参照」を達成するためにポインタ定数を使用して
C.定義するときにこのように「参照」を初期化する必要があります

プロジェクト開発では
。Cを実行するとき++プログラミングを基準に視点を使用して直接立っている、ポインタとは何の関係も、参照は、エイリアス変数である
B。分析をデバッグするときのC ++コードは、いくつかの特別な場合は、考えることができます参照上のC ++コンパイラの視点に立っ。

思考:次のコードは問題がありますか?

int a = 1;
int b = 2;
int *pc      = new int(3);        //定义一个指针,分配空间并赋值
int& array[] = {a, b, *pc};

テスト:

#include <stdio.h>

int a = 1;

struct SV
{
    int& x;
    int& y;
    int& z;
};

int main()
{
    int b = 2;
    int* pc = new int(3);
    SV sv = {a, b, *pc};
    int& array[] = {a, b, *pc}; // error &array[1] - &array[0] = ?  Expected ==> 4
    
    printf("&sv.x = %p\n", &sv.x);
    printf("&sv.y = %p\n", &sv.y);
    printf("&sv.z = %p\n", &sv.z);
    
    delete pc;
    
    return 0;
}

アレイ内の各要素は、それらのアドレスがインクリメントされ、順次格納されます。これは、試験の結果から見ることができます。&配列[1] - &配列[0] =期待==> 4?。だから、これは、C ++での参照の配列をサポートしていません。もちろん、支持構造体(構造体SV)。

おすすめ

転載: www.cnblogs.com/huangdengtao/p/11793110.html