ちなみに、for (i = 0; str[i] != 0; str[i++])のstr[i] != 0;は値がstr[i]に数値の0が入るまでstr[i++]、すなわち、&str[i]のアドレスの指定するメモリの数値を+1するという事でしょうか?
仮に&str[i]自体のアドレスを+1して上げながらメモリに入った数値をそれぞれの&str[i]のアドレスのメモリに入った値を+1したい場合は
どう書けばよいのでしょうか?
あるいは、str[i]はポインタのアドレスが指すメモリに入る数値を表しますが、あるアドレス(例えばアドレス1)のメモリの数値しか上がりません。
では、ほかのポインタのアドレス(例えばアドレス2)のメモリの数値を上げたい場合は
新しくstrA[i]と作り、
for文で((&str))++と((&str A))++の二つを作ればよいのでしょうか?
出来ればプログラムを書いて頂けると理解しやすいです。
編集
エピスさんの解答に対する返事と補足に関して。
ってことは、iの数値を上げながら、iの入っているメモリのアドレスを上げるには
for (i=0;str[i]++, i++)と書けばいいのですね。
では、補足になってしまい申し訳ないですが、
例えば、p は str[i]より、ループ三周目のアドレスの指す数値を知りたいときは
if (i == 3){ printf("%d\n", str[3]);};と書けばいいのでしょうか?
仮にp は str[i]よりよりprintf("%d\n", str[3]);の部分のstr[3]のように書くにはどう書けばいいのでしょうか?if (i == 3){ printf("%d\n", *p ==3);};でしょうか?
編集2
エピスさんの解答より。
>>仮に&str[i]のアドレスを上げながらメモリに入った数値をそれぞれの値を+1したい場合は
どう書けばよいのでしょうか?
++str[i++] または str[i++]++
for ( ... ;str[i]++, i++) の方が明快か。
に関して、アドレスの数値を上げるならば&は書かなくていいのでしょうか?要は
++&str[i++] または &str[i++]++と書かなくて良いのでしょうか?
まあ、アドレスとアドレスの指すメモリに入る数値を同時にあげる書き方が
++str[i++] または str[i++]++という決まりなら従うしかないですが。
&を付けてアドレスとアドレスの指すメモリに入る数値を同時にあげる書き方はないのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/14 16:02
2021/02/14 17:15
退会済みユーザー
2021/02/15 00:47 編集
2021/02/15 02:01
退会済みユーザー
2021/02/15 02:12
2021/02/15 02:21
2021/02/15 02:26
退会済みユーザー
2021/02/15 02:59 編集
回答4件
0
ますますすごい。質問が取っ散らかって迷走・混迷がさら深まってる。何をしたいのかわからないし、何をわかってるのかもあやしい。何年か経ったけど、ひとつひとつが不正確なまま。思い込みでおかしなイメージを描いてる様子もある。耳年増という言葉を思い出した。何かまともに動かすなど絶望的状況なのに、分かりたいし動かしたい・・・不憫だね。
ポインタの表すメモリの数値とメモリに入っている数値を同時にあげるには
同時と言うんだから、なにやらAとB、2つやりたいことがあって、それをひとつの書き方にしたいのかなあ。面倒しなくても、たとえば { A; B; } とでもすればよいのだけど、そもそもAとBが何なのか、それが本当にやるべきことなのかもわからない。質問の文章がヘンだし、彼が前提として理解してるらしいこともいろいろヘンで、それを質してたらきりが無い。彼の意図や疑問に沿った文章になってるかも甚だ疑問だ。このサイトで、文章で、コミュニケーション取るのは難しい思う。それでも彼の質問に真摯に向き合おうとしているカズマさんやエピステーメーさんたちには頭が下がる。私はずいぶん前に手に負えないと思ったから。「ごめん、なに言ってるのかわからない。唐突に出てきた *p ってなんですか?」に拍手しちゃったよ。質問があっちゃこっちゃ拡散するのは、彼の資質では仕方がないだろうが、それじゃ答える方はたまらない。
大虐殺君、リアルタイムで相談できる相手はまだ見つかってないんだろ?プライベートにコンタクトを、と書いたのは、ここで回答依頼しろということではないんだ。ここで通常のレベルでお相手するのは面倒すぎるので、ここでなく、違う手段で、つまり電話とかzoomとかで話してみたいってこと。私の中では困ってる人をほっとけないという気持ちもあるが、怖いもの見たさが勝ってる。
投稿2021/02/15 00:23
総合スコア1382
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/15 01:54
2021/02/15 02:15 編集
0
Visual Studio を使っているんですよね。
main にブレークポイントを置き、デバッグ実行を開始し、
ステップ実行をしながら、変数の値を見ることができます。
ステップ実行のやり方が分からないのですか?
変数の値の見方が分からないのですか?
それから、ポインタを使っていないプログラムでアドレスという用語は、
混乱のもとになるから、使わないほうがよいと思います。
コンピュータは CPU とメモリを持っていて、機械語では、
すべてのデータをメモリのアドレスで参照します。
しかし、これではプログラミングが非常に面倒なので、
アセンブリ言語が使われるようになり、
さらに C などの高級言語が使われるようになりました。
もうアドレスは使わず、変数でメモリ中のデータを参照します。
仮に&str[i]自体のアドレスを
str も i も変数です。
str[i] はメモリ中のデータで、値を持っていますが、
そのデータを書き換えできますから、変数と同じです。
str[i] はメモリ中のデータなので、
メモリ中のどの位置かを示す値、すなわちアドレスがあります。
そのアドレスを取得する演算子が & です。
&str[i] は str[i] のアドレスです。
アドレスということは値です。
値にはアドレスはありません。
「str[i] のアドレス」という表現はありますが、
「&str[i] のアドレス」という表現はおかしいのです。
&str[i] がアドレスですから、
「&str[i]自体のアドレス」とは「str[i] のアドレス自体のアドレス」となって変です。
理解できますか?
追記
&str[i]はポインタstr[i]の指すメモリに入る数値、str[i]はメモリに入る数値だと理解できています。
char str[4] = "abc"; と宣言されていたとすると、
str[i] は、配列 str の i番目の要素で、型は char。
ここで、str[0] = 'e'; と書くことができます。
carnage0216さんの理解しているように str[i] が数値なら、
'a' = 'e' となりますよね。
しかし、値に値は代入できません。
str[i] は値ではないのです。
str[i] は変数と同じものなのです。
変数には値を代入できます。
変数は、次の 2 つの性質があります。
- 値を持つ。
- 値を変更できる。
str[i] は変数(と同じもの)なのです。
carnage0216さんは、1 の性質しか理解していなくて、
str[i] を数値だと言っているのです。
それは間違いです。
&str[i]はポインタstr[i]の指すメモリに入る数値、
「ポインタstr[i]」が間違い。
str[i] はポインタではありません。char型の変数です。
変数ですから、メモリ中にあり、アドレスが決まっています。
&str[i] は、変数str[i] のアドレスです。
アドレスだから、値です。
数値と言ってもいいかもしれませんが、
int や double とは違いますから、単に「値」と言いましょう。
とにかく、&str[i] は、「変数str[i] のアドレス」だと理解しましょう。
投稿2021/02/14 16:16
編集2021/02/14 16:53総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/14 16:20
2021/02/14 16:24
2021/02/14 16:29
2021/02/14 16:36
2021/02/14 17:12 編集
2021/02/14 17:31
2021/02/14 18:05
2021/02/15 20:44 編集
2021/02/16 00:13
2021/02/16 03:03
2021/02/16 06:13
0
str[5] というのがあったとします。
strという名前の配列です。
その大きさは5です。
アドレスは0~4です。
strには{0, 4, 3, 1, 2}という値が入っていたとします。
for文を作ってみます。
C++
1for(int address=0; address<5; ++address){ 2 //ここで何か処理をする。 3 //例えばaddress番目の値を+1する 4 ++str[address]; 5}
strは{1, 5, 4, 2, 3} になります。
元に戻します。
strには{0, 4, 3, 1, 2}が入っています。
値が0でなければ+1したいと思います。
for文を作ってみます。
C++
1for(int address=0; address<5; ++address){ 2 // address番目の値が0でないなら 3 if(str[address]!=0){ 4 //address番目の値を+1する 5 ++str[address]; 6 } 7}
strの中身は{0, 5, 4, 2, 3}になります。
これでアドレスと中身を同時に+1できました。
※コードが正しいかは確認していません。
また一部適切でない表現がありますが簡単のためご容赦ください。
投稿2021/02/16 07:28
総合スコア49
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/16 07:32
2021/02/16 07:33
2021/02/16 07:41
2021/02/16 07:50
2021/02/16 07:51
2021/02/16 07:54
2021/02/16 07:55
0
for (i = 0; str[i] != 0; str[i++])のstr[i] != 0;は値がstr[i]に数値の0が入るまでstr[i++]、すなわち、&str[i]のアドレスの指定するメモリの数値を+1するという事でしょうか?
ちがいます。
str[i++] では 配列str[]の内容を書き換えることはできません。
+1されるのは i であり、str[i] ではありません。
仮に&str[i]のアドレスを上げながらメモリに入った数値をそれぞれの値を+1したい場合は
どう書けばよいのでしょうか?
++str[i++] または str[i++]++
for ( ... ;str[i]++, i++) の方が明快か。
投稿2021/02/14 15:39
編集2021/02/14 15:42総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/14 16:02
2021/02/14 16:14 編集
2021/02/14 16:31
2021/02/14 16:35
2021/02/14 17:32
2021/02/14 17:40
2021/02/15 01:35 編集
2021/02/16 00:09
2021/02/16 01:11
2021/02/16 01:18 編集
2021/02/16 01:23 編集
2021/02/16 01:31
2021/02/16 01:56
2021/02/16 06:33 編集
2021/02/16 06:40
2021/02/16 06:41
2021/02/16 06:56 編集
2021/02/16 07:02
2021/02/16 07:08 編集
2021/02/16 07:09
2021/02/16 07:19 編集
2021/02/16 07:20
2021/02/16 07:21
2021/02/16 07:22
2021/02/16 07:26
2021/02/16 07:39
2021/02/16 07:40
2021/02/16 07:41
2021/02/16 07:43
2021/02/16 07:47
2021/02/16 07:55
2021/02/16 09:26
2021/02/16 09:32
2021/02/16 09:44
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。