1

これは長文の投稿になるので、前もってお詫び申し上げます..しかし、コンテキストで複数の質問をしようとしています:

それで、私は C++ を学ぼうとしてきました。すべてをかなり簡単に習得できましたが、チュートリアルを理解するために、「少し異なる方法」でチュートリアルと並行して物事を行うことを習慣にしています。私が学んでいることの機能。

定数とポインターとの関係に関して、精神的な障害にぶつかったようです。

前のセクションで、参照、逆参照 (および逆参照とポインターに使用される * の違い) についてかなりしっかりと把握したと思います。そして、次のコードを書きました。

int a[5];
int * p;

p = a;

cout << "Select the value for the first item at address(" << &a[0] << ")" << nl;
cin >> *p;
p++;
cout << "Select the value for the second item at address(" << &a[1] << ")" << nl;
cin >> *p;
p++;
cout << "Select the value for the third item at address(" << &a[2] << ")" << nl;
cin >> *p;
p++;
cout << "Select the value for the fourth item at address(" << &a[3] << ")" << nl;
cin >> *p;
p++;
cout << "Select the value for the fifth item at address(" << &a[4] << ")" << nl;
cin >> *p;

for (int n=0;n<5;n++)
    cout << a[n] << "(" << &a[n] << ")" << nl;

今、これが必ずしも最も「最適化された」ソリューションではないことに気付きました..しかし、それは機能し、メモリに保存した配列に「書き込み」、変更を表示することができました。それはきちんとしていて、私が言ったように.. これらがどのように機能するかについてかなりよく理解できたと思います.

..そして、例を使用した次のセクションに進みます。

const char * terry = "hello";

私に教えるために、そして私は引用します:「配列の場合と同様に、コンパイラーは、ポインターが宣言されると同時に、ポインターが指すコンテンツを定数で初期化したいという特別なケースを許可します」(これはcplusplus.comチュートリアル)。

とにかく、要点を言うと、それと前のセクションに慣れるために、次のように書いてみました。

const char * p = "Hello.";

for (int n=0;n<5;n++)
    cout << p[n] << "(" << &p[n] << ")" << nl;
    cout << nl;

..これは機能しません。基本的に、この定数配列内の各文字の RAM ロケーションを読み取れるようにするために、以前のコードを複製しようとしましたが (書き込みの側面はありません)、ポインター、参照、逆参照などの可能なすべての組み合わせを試しました。 .しかし、「こんにちは」全体を印刷するだけです。&p を含む配列。

いったいどうやって定数配列の参照を取得するのでしょうか? 配列を作成してすぐにメモリに割り当て、ポインタ (p) を最初のブロック ("H") の場所に割り当てるという基本的な前提を理解していると思います..ブロックを印刷します。ある時点で印刷する最初のブロックの場所を取得でき(これを行うために使用したコードを思い出せません)、それをforループに結び付けましたが、それでも..常にの場所を印刷しました[n] カウントに続くように割り当てられている場合でも、最初のブロック。

ここで何が欠けているのか、または「頭上」に到達しようとしているだけなのかわかりませんが、メモリの場所を特定できずに配列を作成する使用法/ポイントを理解していないだけかもしれませんその中の各アイテムの割り当て..

ただし、これは次の問題につながります。定数であるかどうかにかかわらず、char 変数のメモリ位置を取得するにはどうすればよいですか? このコードにも問題があります。

char const a = 100;
int * b = &a;

cout << a << nl << *b << nl;
cout << nl;

明らかに、これは機能しません.. b を a の場所に割り当てることができないため、それらは異なる変数であるため..明らかに、char ポインターを作成するのはばかげています。混乱した/null文字を出力するだけだからです場所の代わりに(私はこれをチェックしました、明らかに..単なる仮定ではありません)。

現在の場所よりも「高度な」オプションを使用できないことを願っています..しかし、そうでない場合は、ブロックにアクセスできることの意味がよくわかりません使用されているタイプの制限のためにそれらのすべてにアクセスできない場合、任意のタイプの変数/定数の場所。

この問題は、引用された 3 番目のコードを制限するものでもあります: &p 値を保持するために変数を割り当てることができないという事実は、それ自体が互換性を保つために char でなければならないためです.. 8 桁の参照を保持しません。

4

1 に答える 1

3

const char * p = "Hello.";

[...]   cout << &p[n]   [...]

&p[n]は へのポインタcharでありcout::operator<<、char へのポインタを取り、null で終わる文字列を出力するオーバーロードがあります。これがおそらく混乱の原因です。

于 2013-03-20T13:44:09.650 に答える