以下のコードは、配列およびポインタ指定で同じ値を表示するコードです。
C
1char buf[] = "1234567890";
2char *ptr = buf;
3int i;
4
5for(i=0;i<10;i++)
6{
7 printf("%c, ", buf[i]);
8 printf("%c\n", *(ptr+i));
9}
配列の場合に要素指定がインデックス指定(=buf[要素のインデックス])なのは当然ですが、
ポインタの場合はというと、これもいわばインデックス指定です。
配列とポインタでなにが異なるかというと、上記例の場合記述様式だけです。
計算的にはどちらも「配列先頭からいくつ目の要素の値であるか」を表します。
※表現としては、以下のように記述しています。
配 列 :配列変数名[インデックス値]
ポインタ:*(ポインタ変数名+インデックス値)
突然ですが、ちょっとここで配列の記述だけでポインタを得ることを考えてみます。
以下は、配列にインデックス指定をした変数から値が入っているアドレスを得るものです。
C
1char buf[] = "1234567890";
2char *ptr;
3int i;
4
5for(i=0;i<10;i++)
6{
7 ptr = &buf[i];
8 printf("%c, ", buf[i]);
9 printf("%c\n", *ptr);
10}
&buf[i] と記述すると、「buf[i] の値が入っているアドレス」を取得できます。
これは ptr + i と記述するのと同じアドレスを得られる書き方です。
[補足]-------------
もし & や * の意味がわからない場合は、アドレス演算子と間接演算子についてちょっと勉強が必要です。
ここで質問者さんの疑問を見てみます。
C
1p1 = str1 + strlen(str1) - 1;
これは基本的に、文字列の長さを -1 した値をインデックス値としてアドレス計算しています。
この書き方を、配列表記で考えてみると以下のようになります。
C
1p1 = &str1[strlen(str1) - 1];
でも、質問者さんのもう1つの書き方だと必要な情報が足らなくなることが分かります。
C
1p1 = strlen(str1) - 1;
2
3p1 = & (ここが足りない) [strlen(str1) - 1];
ポインタ計算をする場合に起点になるアドレスは、この場合 str1 が持っています。
そのことを忘れて位置だけ計算しても、どこからデータを取り出すかを指定しなければデータは取り出せない。ということになります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。