概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C ポインタによる配列表現
2006年08月13日 (日) | 編集 |
盆。祖先の霊をお迎えするとか見送るとか。
これは輪廻転生を否定する行事と言えるのかねー?
転生してしまえば祖先の霊も帰ってこれないわけであるし。


ま、いいや。
こっちはこっちで生きている以上は頑張ろう。死生観はその後で考えればよし。
今回も配列関係だ。しかもまだまだ続きそうだな。
今までの例だとポインタpaの値をpa++で次に進めて、配列a[]や文字列strなんかのデータをそれぞれ参照したりしたわけだが、paを固定しておいてそこから何番目のデータを参照する、といったことも可能だそうだ。
例えば、ポインタpaを使って配列a[]のi番目の要素を参照するには、

*(pa+i)

とか

pa[i]

とか記述するとそれぞれpaが持つアドレスにiを加えたアドレス、つまりa[i]のアドレスの内容を参照してくれる。上の*(pa+i)はpa+iのアドレスを参照しているという記述だが、下のpa[i]は配列paのi番目である。そして両方が参照する値は同じ。つまり、pa[i]は配列に見えるが、実際はアドレスを計算して取り出しているってことやね。よく分からんけど。

とにかくそういう理屈で、pa[i]はアドレス計算をしてデータを参照しているだけなので、例えばpa[0]~pa[9]といったような領域が新しく確保されているわけではないことに注意だ。

ま、形式としてはこんなものだな。
実際にやってみよう。
ポインタを使って文字列を後ろの文字から表示してみる。

まずポインタ変数strを宣言して、文字列のアドレスを代入。

char *str;
str="Hello";


ちなみにこれは

char *str="Hello";
int i;


のように1行で表現出来る。後、ループ変数としてiも宣言しておこう。
次に、後ろから文字を取り出して表示する部分を記述する。
順番に取り出す場合はwhileを使ってデータの終わりまで繰り返したが、逆に取り出す場合はfor文による繰り返しを使うと便利である。

for(i=4;i>=0;i--){
 putchar(str[i]);
}


これでstr[4]~str[0]まで文字を取り出して表示する。
scanfを使わずにputchar使うのは1文字ずつだからかね。

pointer_str2_test.jpgpointer_str2_test2.jpg

こんな感じ。うむ分かり易い。
だがこれだけだと寂しいので取り出した文字を別の配列に代入してみる。

宣言、代入部分は殆ど変わらないが、代入用に別の配列を宣言しておく。

char *str="Hello";
char c[10];
int i;


次にループ部分で配列c[i]に順番に後ろの文字から代入する。
Helloは5文字なので、c[0]にstr[4]、c[1]にstr[3]、c[2]にstr[2]、c[3]にstr[1]、c[4]にstr[0]の値をそれぞれ代入すればいいことになるので

for(i=0;i<=4;i++)
 c[i]=str[4-i];


これで(多分)OK。
後は配列cに配列の終わりとしての値\0を代入して配列を表示する。

c[5]='\0';
printf("%s",c);


終了。

pointer_str2_test3.jpgpointer_str2_test4.jpg

こんな感じ。内部の処理は多少増えてるが、結果的には何も変わらんね。


まとめよう。

ポインタを使ってアドレス計算してデータを参照出来る
*(pa+i)pa[i]は同じ意味である
カレーにセロリも悪くない


以上。
ややこしいと思ってたが結構分かり易いな。
今後どうなるかは分からんが。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。