A 回答 (3件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
p:アドレス、ポインタ、住所の番地 好きに受け取ればいい
*p:そのアドレスの中身、住人
p *p
0 a(0番地にはaさんが住んでいる)
1 b
2 c
3 d
4 e
++p:隣の番地に移動
++(*p):p番地のデータを1個増やす(aならbに)
No.2
- 回答日時:
pがポインタの時、
++p ポインタ自体を進める(アドレス自体を型の分だけ加算する)
++(*p) ポインタが指し示す値に加算する
というのが違いです。
文字だからピンと来ないだろうから、例えば
int a = {1, 2, 3, 4, 5};
int* p;
p = a;
とでもしておいて、
++p
と
++(*p)
の違いを調べてみれば一発で分かりますよ。
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でない間処理されます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
戻り値で構造体を返すことは可...
-
init関数の意味
-
C言語の関数と配列に関する質問
-
C言語のポインタに直接アドレス...
-
Run-Time Check Failure #3とい...
-
fopne で失敗する原因
-
main(int argc,char **argv[])...
-
Cで作成したDLL関数をVBから呼...
-
ExcelVBAでのkernel32(64bit)
-
NULLとブランクの違い
-
アプリを32bitから64bit移行
-
VBはCを混乱させる?
-
関数ポインタの高速化のメリット
-
ハンドル、アドレス、ポインタ...
-
#define NULL ((void *)0) の弊害
-
C言語でのconstを返す関数
-
ReadFileの読み込みエラーについて
-
C++で関数ポインタから関数名を...
-
【C言語】戻り値が構造体の関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
C言語の関数と配列に関する質問
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
セグメントエラー
-
アプリを32bitから64bit移行
-
コンストラクタでnewを失敗した...
-
ExcelVBAでのkernel32(64bit)
-
Cで作成したDLL関数をVBから呼...
-
ハンドルはポインタか
-
DLL<->VB間での受け渡し(文字...
-
C言語でのconstを返す関数
-
ポインタについて
-
参照型で受け取った引数をポイ...
-
TCHAR文字列内の検索について
-
デバイスハンドルとは?
-
基本アルゴリズムの『返す』の...
おすすめ情報
特に
for (char* p = str; *p; ++p)
{
++(*p);
printf("%s\n", &(*p));
}
の++pと ++(*p)の違いがよくわからず混乱しています。