質問したいことがございます。
まず一つめ
仮に&str[i]のアドレスを上げながらメモリに入った数値をそれぞれの値を+1したい場合は
どう書けばよいのでしょうか?
++str[i++] または str[i++]++
for ( ... ;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);};でしょうか?
二つ目
もう一つ、「仮に&str[i]のアドレスを上げながらメモリに入った数値をそれぞれの値を+1したい場合は
どう書けばよいのでしょうか?
++str[i++] または str[i++]++
for ( ... ;str[i]++, i++) の方が明快か。と言われたのですが、
アドレスとアドレスの指すメモリの数値を上げるならば、++str[i++] または str[i++]++に&を付けてアドレスとアドレスの指すメモリに入る数値を同時にあげる書き方はないのでしょうか?
要は++&str[i++] または &str[i++]++という書き方はないのでしょうか?
ポインタが指すメモリに入った変数の数値と同時に数値を上げるならば
アドレスを上げるのに&の演算子は必要なはずです。
ただ、アドレスを上げながらアドレスの指すメモリに入った数値を上げる書き方が
++str[i++] または str[i++]++と決まっているならば従うしかないですが。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/15 02:17
2021/02/15 02:21
2021/02/15 02:26
2021/02/15 02:28
2021/02/15 02:33 編集
2021/02/15 02:40
2021/02/15 02:44 編集
2021/02/15 02:45
2021/02/15 02:52 編集
2021/02/15 02:51
2021/02/15 02:53
2021/02/15 03:23
2021/02/15 04:07
2021/02/15 04:09
2021/02/15 04:09
2021/02/15 04:54
2021/02/15 06:09
2021/02/15 06:11
回答4件
0
例えばこんな配列があるとしよう.
3つの要素 str[0],str[1],str[2] の値をそれぞれ+1すれば,かわいい動物の名称を示す文字列にすることができる.
C++
1char str[4] = { 'C'-1, 'a'-1, 't'-1 };
そのような処理が行いたいという話なのであれば,最もシンプルな方法はこうだ.
C++
1++str[0]; 2++str[1]; 3++str[2];
やりたいことを素直に実装した.完遂したと言える.
「同じような記述を3回も繰り返すすの嫌だから,俺はループで書くぜ!」とか言うならば,こうだろう.
C++
1for( int i=0; i<3; ++i ) 2{ ++str[i]; }
これで十分ではなかろうか.
これ以上,何を望むのか?
わざわざポインタ型の変数p
を持ち出して,以下のようにいろんな形に書くこともできるだろうが,そこには特に面白いこともないように思える.
C++
1char *p = str; 2for( int i=0; i<3; ++i ) 3{ ++( *(p+i) ); }
C++
1char *p = str; 2for( int i=0; i<3; ++i ) 3{ ++p[i]; }
C++
1for( char *p=str; *p; ++p ) 2{ ++(*p); }
結論:難読コードを目指すとかいう話でないならば,素直に書けばどうか.
自分自身で把握し難くなるような文法を持ち出しても無意味な苦労が増えるばかりであろう.
[追記]
以下の2パターンが混じって混乱しているようにも見える.
(1)ポインタp
が,常に「いじくるべき要素のアドレス」を指すように p
を更新しながら配列要素をいじくる
C++
1//配列の先頭要素のアドレスを指すポインタpがあって… 2char *p = &(str[0]); //単に p = str; でも同じ 3 4//先頭要素の値を100に変更 5*p = 100; 6 7//2番目の要素の値を200に変更する 8++p; //pのアドレスを「2番目の要素のアドレス」に更新して… 9*p = 200; //2番目の要素の値を変更 10 11//3番目の要素の値を300に変更する 12++p; //pのアドレスを「3番目の要素のアドレス」に更新して… 13*p = 300; //3番目の要素の値を変更
(2)ポインタp
は「配列の先頭要素のアドレス」を指すもので,いじくる要素のアドレスを「pの値からのアドレスオフセット」で示す
C++
1//配列の先頭要素のアドレスを指すポインタpがあって… 2char *p = &(str[0]); //単に p = str; でも同じ 3 4//先頭要素の値を100に変更 5*p = 100; 6 7//2番目の要素の値を200に変更する 8*(p + 1) = 200; //2番目の要素の値を変更 9 10//3番目の要素の値を300に変更する 11*(p + 2) = 300; //3番目の要素の値を変更
投稿2021/02/15 03:13
編集2021/02/15 05:09総合スコア11985
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/15 03:57
2021/02/15 04:01
2021/02/15 04:07
2021/02/15 04:12
2021/02/15 04:21
2021/02/15 04:31
2021/02/15 04:37
2021/02/15 04:39
2021/02/15 16:16
2021/02/15 16:46
2021/02/15 17:23 編集
2021/02/15 17:38
2021/02/16 01:11
2021/02/16 01:27 編集
2021/02/16 06:40
2021/02/17 04:26 編集
2021/02/17 04:25
2021/02/17 04:33
2021/02/17 04:42
2021/02/17 04:51
0
&str[i]のアドレスを上げながらメモリに入った数値をそれぞれの値を+1したい場合は
悩むぐらいであれば、アドレスと中身の数値を別々にインクリメントすべきです。
「コードゴルフで1文字でも書くのが惜しい」など特殊な状況にないのであれば、インクリメントを式の途中に組み込むのは、可読性を下げるだけとなります。
投稿2021/02/15 02:12
総合スコア145967
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/15 02:22
2021/02/15 02:24
2021/02/15 02:26
2021/02/15 02:36
2021/02/15 02:37
2021/02/15 02:38
2021/02/15 02:41
2021/02/15 02:46
2021/02/15 02:49
2021/02/15 02:49
2021/02/15 02:54
2021/02/15 02:56 編集
2021/02/15 02:59
2021/02/15 03:05
2021/02/15 03:06
2021/02/15 04:14
2021/02/15 04:18
2021/02/15 04:19
2021/02/15 04:29
2021/02/15 04:33 編集
2021/02/15 04:34
2021/02/15 05:13 編集
2021/02/15 04:55 編集
2021/02/15 05:13
2021/02/15 05:16
2021/02/15 05:17
2021/02/15 05:19
2021/02/15 05:26
2021/02/15 05:28
2021/02/15 05:55 編集
2021/02/15 05:46
2021/02/15 05:58
2021/02/15 11:37 編集
2021/02/15 06:24
2021/02/15 06:24
2021/02/15 06:33
2021/02/15 06:52
2021/02/15 06:53
2021/02/15 16:18
2021/02/15 17:28
0
str[i]++;
i++;
ではダメなんでしょうか。
ダメな理由はなんでしょうか
投稿2021/02/15 02:06
総合スコア88038
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/15 02:22
2021/02/16 06:42 編集
0
str[i]が指し示す位置を動かしつつ、str[i]の中身を変えたいということであれば
以下のように書けばいいだけなんだけど。
↓の例では配列の中身を全て0で初期化しているので出力結果は全て1になります。
C
1#include <stdio.h> 2int main(void){ 3 int i; 4 int str[5]={0}; 5 6 for (i = 0; i < 5; i++){ 7 str[i]++; 8 printf("%d\n", str[i]); 9 } 10}
そもそも配列の指し示す位置を動かす為に&を付ける必要があるという思い込みが
間違っていて、単純にstr[0]、str[1]、str[2]としていけば指し示す位置を
変更出来るということが理解出来ていないのかな?
投稿2021/02/15 02:51
総合スコア418
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/15 02:56
2021/02/15 03:00 編集
2021/02/15 02:58
2021/02/15 03:04 編集
2021/02/15 03:38
2021/02/15 03:52 編集
2021/02/15 03:59
2021/02/15 04:00
2021/02/15 04:10 編集
2021/02/15 04:08
2021/02/15 04:17
2021/02/15 05:36
2021/02/15 05:48 編集
2021/02/15 11:02
2021/02/15 16:17
2021/02/16 01:14
2021/02/16 05:05
2021/02/16 05:17
2021/02/16 05:58
2021/02/16 06:08
2021/02/16 06:09
2021/02/16 06:20
2021/02/16 06:30
2021/02/16 06:36
2021/02/17 00:11
2021/02/17 00:14 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。