俺言語。

自分にしか理解できない言語で書かれた備忘録

ポインタと文字列

ArduinoGPSからのデータを処理した際に使った,
何度も忘れるポインタと文字列のおぼえがき。

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