dポイントプレゼントキャンペーン実施中!

str[i] は *(str + i) と同義です。なので iが変化すれば、当然ながら str+i は変化します。
# strは変化してません、固定値です。といわれたのですがか、
ですが、&str[i] はアドレスの指す配列を表すので変数iで繰り上げてアドレスを上げるのに、なぜstr[i]だけなのですか?str[i]だけではアドレスの数値を上げられないと思います。
書くならば、(&str + i) ではないのでは?と思いました。

質問者からの補足コメント

  • str[i] と*(str + i) および &str[i] と str + iと&*(str + i) は同じですか?
    仮にiを+1していくとして、
    iが+1されるとstr[i]のポインタのアドレス自体ではなく、
    アドレスに入っているメモリの値が+1され、
    iが+1されるとつぎのアドレスに移行すると聞いたのですが、それは上の5つのうちどれですか?
    また、が+1されるとstr[i]のポインタのアドレス自体ではなく、
    アドレスに入っているメモリの値が+1され、のは5つのうちどれですか?

      補足日時:2021/02/15 15:30

A 回答 (3件)

char str[10];


であるならば、

// str 単独で使うと "char[10] の先頭アドレス" の意味になります。
str+0; // 先頭アドレス + char[0]分の幅
str+1; // 先頭アドレス + char[1]分の幅
str+2; // 先頭アドレス + char[2]分の幅

// アドレスから値を求める演算子 *
*(str+0); // (先頭アドレス + char[0]分の幅)にある char 値
*(str+1); // (先頭アドレス + char[1]分の幅)にある char 値
*(str+2); // (先頭アドレス + char[2]分の幅)にある char 値

// 先頭アドレスから索引の位置にある値を求める演算子 []
str[0]; // (先頭アドレス + char[0]分の幅)にある char 値
str[1]; // (先頭アドレス + char[1]分の幅)にある char 値
str[2]; // (先頭アドレス + char[2]分の幅)にある char 値

// 値からアドレスを求める演算子 &
&(str[0]); // ((先頭アドレス + char[0]分の幅)にある char 値)のアドレス
&(str[1]); // ((先頭アドレス + char[1]分の幅)にある char 値)のアドレス
&(str[2]); // ((先頭アドレス + char[2]分の幅)にある char 値)のアドレス

演算子 & は値からアドレスを求めるので、
アドレスである str に使用するとプログラムが壊れます。
    • good
    • 1
この回答へのお礼

ありがとうございます。
str[i] と*(str + i) および &str[i] と str + iと&*(str + i) は同じですか?
仮にiを+1していくとして、
iが+1されるとstr[i]のポインタのアドレス自体ではなく、
アドレスに入っているメモリの値が+1され、
iが+1されるとつぎのアドレスに移行すると聞いたのですが、それは上の5つのうちどれですか?
また、が+1されるとstr[i]のポインタのアドレス自体ではなく、
アドレスに入っているメモリの値が+1され、のは5つのうちどれですか?

お礼日時:2021/02/15 15:30

その場合 &str+i は「ポインタのポインタ」にはならないです>#2.



配列とポインタとの関係をきちんと理解していない人がときどきいたりしますが, 例えば
int array[5];
と宣言されていた場合
array
は「そのままでポインタとなる」わけではなく,
int [5]
という型を持つ「配列オブジェクト」を表すのです. ところが
配列オブジェクトは特定の状況を除いて「その配列の先頭要素のアドレス」に変換される
という規則があるため, 結果として「先頭要素のアドレス」とみなされることが多いにすぎません.

ちなみに規格では
A[B] は *((A)+(B)) と同じ
&*p は (*p が型として合法なら) p と同じ
となっている.
    • good
    • 0

ご質問者様が配列とポインタで『混乱されている』のは理解できます。

但しご質問の文面は『...ですか。』が多すぎて、一体『何処で混乱しているのか』判断ができません。以下の説明がご質問者様のポイントとズレているならば無視して下さい。

char
str [] = "abcde";

1.上は文字列"abcde"を表す配列を宣言したところです。これ以後のソースコードに...

str [ 2 ]

と書けば、配列は"0"から始まりますから「配列strの3番目のデータ(つまり0,1,2と数えて)」を表します。上の宣言を見ればstr [ 2 ]はデータ'c'を表していることをご理解いただけるでしょう。つまりstr[i]と書くことは、ポインタではなくデータを表すことにご注意下さい。

2.上の宣言は以後のソースコードの中で...

str

と書けば今度はポインタを表すこともご存知のはずです。それならば...

str + i

と書き表してもポインタを表すことは理解できますか? これは『ポインタ"str"を"i"だけインクリメントしたポインタ』です。ポインタは...

*(str + 2)

などと書いた時に初めて「データ」を示すことができます。このデータは先程の配列str [ 2 ]と同じ'c'を表していることを理解できますか?
ポインタの名前の先頭に"*"を付けるとデータを表すことにご注意下さい。

3.1の例に書いたように配列をstr [ 2 ]と書き表すと、それはデータ'c'を表すことに注目して下さい。そして...

&str [ 2 ]

と書くと、今度はポインタを表すことにお気づき下さい。つまり、データを表す名前の先頭に"&"を付けるとポインタになるのです。ご質問者様は「&str[i] はアドレスの指す配列を表す...」などと大変難しい表し方をしていますが、&str [ 2 ]は単にデータ'c'が格納された場所を表すポインタ(アドレス)でしかありません。

4.ある変数がデータを示すのか、あるいはポインタなのかきちんと判別することが重要です。
その上でデータならば先頭に"&"を付ければポインタになり、ポインタの先頭に"*"を付ければデータになることをきちんと把握することです。

5.ここまでをご理解いただければ、ご質問者様お書きの...

(&str + i)

はポインタでもデータでもなく、なんと『ポインタのポインタ』になることをご理解いただけるはずです。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!