試験で質問があり、次の質問が表示されます:-
4行目の意味は何ですか(4行目で何が起こるのですか?)
1 char i , *p;
2 i=65;
3 p=&i;
4 p=(char*)66;
5 (*p)++;
誰か助けてくれませんか?
ポインターに関するいくつかの優れた情報を提供するこのチュートリアルをご覧ください。それが何をするのかを正確に説明したくはありません。なぜなら、それは何も教えず、代わりにオウムのファッションの答えを与えて、このような次の質問に困惑するからです.
ただし、探したい領域はキャストとポインターです。
"66" は (char *) 型にキャストされます
p
はポインター (この場合は char へ) であるため、アドレスを保持します。66
4 行目は、単純にアドレスを に書き込みますp
。行が実行された後、p
アドレスを指し66
ます。これが有効なアドレスかどうかは別の問題です。
p=(char*)66;
メモリ内のアドレス 66 をポインタにキャストし、次の行でそれをインクリメントします。現状では、RAM のバイト 66 に書き込む権限がない限り、このコードはおそらく機能しません。
コードを分かりやすくするために 4 行目を修正しました。
1 char i , *p;
2 i=65;
3 p=&i;
4 *p=(char)66;
5 (*p)++;
1 行目では、 chari
と char へのポインターがありますp
。
2 行目でi
は、値 65 を保持します。これは、ASCII の文字 'A' です。
3 行目でp
、 のアドレスを指しますi
。
p
4 行目で、 を指すアドレスの値はです66
。これはB
ASCII の文字です。p
のアドレスを指しているのでi
、i
の値も持っています66
。
5 行目では、 を指すアドレスの値が からにp
増加され、ASCIIの文字になります。66
67
C
印刷しi
ない*p
と文字「C」が表示されます。
プログラミング言語を学ぶとき、それを声に出して言う方法を学ぶと、その言語の意味を理解するのに役立つことがわかりました。
したがってp = (char *)66;
、「66をpに割り当てる」と読み、他の人が述べたように、(char *)
はキャストです。66 をchar *
char へのポインタとして知られているものにキャスト (型を変更) しています。または、文字変数のアドレス。
基本的に、行全体は「アドレス 66 で文字を見つける」と言っており、以前は に保持されていた文字を指していたポインターに 66 を割り当てますi
。
この場合のアスタリスク ( ) の使用は、「での値は 66 であり、文字値です」という意味*
の行とは異なります。したがって、最初に見た行は に保持されているアドレスを変更していましたが、2 行目は に既に保持されているアドレスの値を変更しています。*p = (char) 66;
p
p
p
また、最後の行 ( (*p)++
) は次のことを意味します。
これらはこの質問に対する教科書的な回答ではないことに注意してください。これは、回答する前に質問についてどのように考えるかです。また、それが実際にテストで与えられたコードである場合、実際にそれを行うのは悪い考えであることに注意することが重要です。4 行目と 5 行目では、おそらくアプリケーションに属していないメモリ内のランダムな位置を変更しています。これにより、クラッシュやその他の厄介な問題が発生する可能性があります (おそらくそうなるでしょう)。