その1のつづき。ポインタによるアクセス
■配列のように、添字を使ってアクセスする
ポインタに文字列をコピーしたあと、その何番目かの文字を利用したい場合は、どうしたらよいのでしょうか?
1つの方法は、配列のように、添字を使います。
こんなかんじ
#include <stdio.h> #include <stdlib.h> #include <string.h> void main() { char *str1; str1 = (char *)malloc(20); strcpy(str1,"Hello"); // 配列のようにアクセス printf("%c ¥n",str1[1]); free(str1); } |
(上記 ¥ < > は、本当は半角)
上記の例では、str1[1]というように、ポインタで取った領域を配列のようにアクセスしています。
■ポインタによるアクセス
もうひとつは、*を付けてアクセスする方法です。
*を付けると、その領域の中身を示します。
なので*str1は、str1の文字列(領域)の、先頭の文字を現します。
そのとなりの文字が見たい場合、str1+1で、2番目の文字のところに行きますので、*(str1+1)で、隣の文字の中身が見れます。
str++のように足し算も出来ます。
こんなかんじです。
#include <stdio.h> #include <stdlib.h> #include <string.h> void main() { char *str1; str1 = (char *)malloc(20); strcpy(str1,"Hello"); // ポインタでアクセス printf("%c ¥n",*str1); // となりを、ポインタでアクセス printf("%c ¥n",*(str1+1)); // ++で足せる printf("%c ¥n",*(str1++)); free(str1); } |
(上記 ¥ < > は、本当は半角)
■*(str1++)と(*str1)++は違う
上記で、str1に"Hello"とセットしたとき、
*(str1++)と(*str1)++は違う意味になるので、注意です。
*(str1++)というのは、まずはじめにstr1を++(インクリメント、1足す)して、
その後、*つまり、中身を表示しなさいという意味です。
上記の例だと、Hの次の'e'という文字になります。
一方、(*str1)++は、まずはじめに、中身を求め(上記の例だと'H')、
その値に1を足しなさいということになるので、'H'の次の'I'が答えと
いうことになります。
このように、*(str1++)と(*str1)++は違う意味になるので、注意です。
次に、配列とポインタの類似性について触れたいと思います。