A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
取り敢えず、表示可能な変数やポインタのアドレスは片っ端から表示とか。
#include <stdio.h>
int main(void) {
char str[] = "abcde" ;
printf("str=\"%s\", str=%p\n\n", str, str);
for (char* p = str; *p; ++p)
{
printf("for loop 1, p=%p, str=\"%s\", str=%p\n", p, str, str);
++(*p);
printf("++(*p);\n");
printf("for loop 2, p=%p, str=\"%s\", str=%p\n", p, str, str);
printf("%s\n", &(*p));
printf("for loop end.\n\n");
}
}
自分とこ、というかオンラインの環境だと、出力結果に◆付けるとして、
◆str="abcde", str=0x7ffc3899b250
が最初の状態。
質問者さんの環境で実行すれば、当然strの格納先のアドレスは変わるハズ。
1回目のforループで、
◆for loop 1, p=0x7ffc3899b250, str="abcde", str=0x7ffc3899b250
となります。
メモリに、以下のように文字列が格納されている状態。
【メモリ内容】
+00 +01 +02 +03 +04 +05
0x~b250 61 62 63 64 65 00 abcde
pは~b250番地を指している。
◆++(*p);
で、pの指している~b250番地の値が1加算されます。
メモリ内容がどう変化したのか、上とよく見くらべて下さい。
【メモリ内容】
0x~b250 62 62 63 64 65 00 bbcde
◆for loop 2, p=0x7ffc3899b250, str="bbcde", str=0x7ffc3899b250
pの指している場所を表示します。
◆bbcde
◆for loop end.
2回目のforループで、++pされて、pの指してるアドレスが1つズレます。
◆for loop 1, p=0x7ffc3899b251, str="bbcde", str=0x7ffc3899b250
メモリ内容はさっきのまま。
【メモリ内容】
+00 +01 +02 +03 +04 +05
0x~b250 62 62 63 64 65 00 bbcde
◆++(*p);
で、pの指している~b251番地の値が1加算されます。
上と比べて下さい。
【メモリ内容】
0x~b250 62 63 63 64 65 00 bccde
◆for loop 2, p=0x7ffc3899b251, str="bccde", str=0x7ffc3899b250
pの指している場所を表示します。
1回目のforループと違って、~b251番地からの文字列を表示します。
◆ccde
◆for loop end.
って具合で、forループの終了の条件の、pの指しているアドレスの値が00でない間処理されます。
No.2
- 回答日時:
pがポインタの時、
++p ポインタ自体を進める(アドレス自体を型の分だけ加算する)
++(*p) ポインタが指し示す値に加算する
というのが違いです。
文字だからピンと来ないだろうから、例えば
int a = {1, 2, 3, 4, 5};
int* p;
p = a;
とでもしておいて、
++p
と
++(*p)
の違いを調べてみれば一発で分かりますよ。
No.1
- 回答日時:
p:アドレス、ポインタ、住所の番地 好きに受け取ればいい
*p:そのアドレスの中身、住人
p *p
0 a(0番地にはaさんが住んでいる)
1 b
2 c
3 d
4 e
++p:隣の番地に移動
++(*p):p番地のデータを1個増やす(aならbに)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
C言語のポインタに直接アドレス...
-
ファイルポインタのヘッダーフ...
-
コンストラクタでnewを失敗した...
-
ExcelVBAでのkernel32(64bit)
-
nullポインタを逆参照とは?
-
LPSTR型の初期化について
-
戻り値で構造体を返すことは可...
-
C言語でのconstを返す関数
-
C++で関数ポインタから関数名を...
-
SystemC言語の文法(関数の引数...
-
VB6でのgethostbyaddrの使用方...
-
アプリを32bitから64bit移行
-
パスからファイル名を抽出
-
無効なポインタ操作のエラー
-
構造体のメンバが配列の場合の扱い
-
ハンドル、アドレス、ポインタ...
-
別のDLLのダイアログを・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
fopne で失敗する原因
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
参照型で受け取った引数をポイ...
-
ハンドル、アドレス、ポインタ...
-
ハンドルはポインタか
-
C言語でのconstを返す関数
-
デバイスハンドルとは?
-
Cで作成したDLL関数をVBから呼...
-
popenした子プロセスのプロセス...
-
c言語で任意のファイルから読み...
-
[excel vba] マウスポインタの...
-
プーさんのマウスポインタを教...
-
パスからファイル名を抽出
-
基本アルゴリズムの『返す』の...
おすすめ情報
特に
for (char* p = str; *p; ++p)
{
++(*p);
printf("%s\n", &(*p));
}
の++pと ++(*p)の違いがよくわからず混乱しています。