MW211 EXIT

devlog
C/ポインタ定義の「*」の位置
2014年06月17日
ポインタ定義において、「*」の位置が以下の二種類のパターンがある。
┌──────────────────────────────────────┐
│char    *ptr  = NULL;                                                       │
├──────────────────────────────────────┤
│char*   ptr   = NULL;                                                       │
└──────────────────────────────────────┘
果たして、どっちがいいのであろうか?

後者を推奨する。根拠は以下の通り。

(1) 「const」との関係から
┌──────────────────────────────────────┐
│char* const   ptr   = NULL;                                                 │
└──────────────────────────────────────┘
  「ptr」が指す値を変更できないように縛るには「const char* ptr」のような
  書き方となるが、「ptr」のアドレスを変更できないように縛る場合、
  「char* const ptr」のように「const」が「*」の後ろに来る。
  これが「char *ptr」の場合だと、説明できない。

(2) 初期値の代入が意味するところから
  「*ptr = NULL」では「ptr」の指す先が「NULL」になるが
  「ptr = NULL」だと、「ptr」のアドレスが「NULL」になる。
  定義時の意味するところは後者なので「char*」+「ptr = NULL」の方が
  わかりやすい。

(3) キャスト時の記述
  「(char *)ptr」だと「(char)」+「*ptr」的な錯覚を与える。
  #ちと強引か。。。

なお、前者の場合、以下のような書き方ができるという利点があるようだが…。
┌──────────────────────────────────────┐
│char    *ptr1, *ptr2;                                                       │
└──────────────────────────────────────┘
分類:C/C++