ポインタと文字列
ArduinoでGPSからのデータを処理した際に使った,
何度も忘れるポインタと文字列のおぼえがき。
・C言語に文字列はない。
char st = "ABC" ←これはエラー
char st[4] = "ABC" ←これはok
<追記> これはC言語の特例。
本来は終端文字\0が必要だが宣言の時に限り\0無しでも可
・int *a
→ポインタの宣言。int型の変数のみ指すことができる。
代入する際は変数のアドレスを指定。
・(ポインタ宣言後の)a
→指しているもののアドレス。
ポインタが文字列を指している場合,
アドレスは文字列そのものになる!
逆に言うと文字列はアドレスとして扱われる。
ex) int *a = "ABCD";
println(a)
表示される結果:ABCD
・*a
→指している変数の内容値
ポインタの宣言で使う「*」とは別物
文字列を指している場合,先頭の文字が表示される。
ex) int *a = "ABCD";
println(*a)
表示される結果:A
・char st[4] = "ABC"
→st[0] = A
st[1] = B
st[2] = C
<追記>これも特例。宣言時に文字列を代入しているから。
一文字ずつ代入する際は\0が必要。
st[0] = A
st[1] = B
st[2] = C
で宣言する場合はst[3]='\0'としないと文字列として認識してくれない。
・(ポインタ宣言前の) &A
→ 変数Aのアドレスを参照
・'&'と'*'は正反対の意味を持つ。"参照"の&とは違うので注意
'&' →変数のアドレス
'*' →アドレスにある変数
ex) *(&A) = A
変数Aのアドレスの変数=Aの変数
・変数をポインタに代入する場合,&をつけてアドレスを代入する。
文字配列を代入する場合,&はつけてはいけない
ex1)int x = 10;
int *p =&x
ex2)char st[4] = "ABC" ;
char *p;
p = &st ←これはエラーが出る。
p = st ←これはok
p = &st[0] ←これでもok(p=stと同じ結果になる)
・文字列を指しているポインタをインクリメントすると文字を1つずつ取り出せる。
ex) char *p;
char st[4] = "ABC";
p = st;
println(*(p+1));
表示される結果:A
println(*(p+2));
表示される結果:B
println(*(p+3));
表示される結果:C
<参考にしたページ>
http://homepage1.nifty.com/toshio-k/prog/c/string.html
http://ratan.dyndns.info/MicrosoftVisualC++/adress6.html
http://www9.plala.or.jp/sgwr-t/c/sec10.html
http://program.station.ez-net.jp/mini/language/cpp/pointer.asp