文字列演算

;AutoTrim,ON(デフォルト)での実行結果テスト
a := " a1"
b := " b2 "

s0  = %a%%b%    ; 結果: "a1 b2"
s1 := ab        ; 結果: ""
s2 := a + b     ; 結果: ""
s3 := a & b     ; 結果: ""
s4 := a | b     ; 結果: ""
s5 := a b       ; 結果: " a1 b2 "
s6 := a . b     ; 結果: " a1 b2 "
msgbox,,a = "%a%" と  b = "%b%" の連結テスト,`%a`%`%b`% = "%s0%"`n`nab = "%s1%"`n`na + b = "%s2%"`n`na & b = "%s3%"`n`na | b = "%s4%"`n`n a b = "%s5%"`n`n a . b = "%s6%"

おそらくは後から機能追加していった弊害なんだろうけど現在のAutoHotkeyは妙ちくりんな記述ルールが多い。文字列の扱いも思うような結果が出ず悩まされることがよくある。
デフォルトでAutoTrimが効いているのでタブスペースの入る文字列の代入には = より := を使う方が良さげ、だがこの := での文字列連結の仕方がいまいち理解しづらい。
+ & | などを試してみるが全部空文字になる。色々試してどうやらスペース連結してやればOKらしいので下のようにやってるが正直分かりづらい。

msg := str1 " " str2 "`n" str3

スクリプト仕様によると正式には . で連結するのが正しいらしい。だけどこれ a.b や a. b や a .b とするとエラーで怒られる。どうも「.」の両端はスペースを空けないといけないようだ。

msg := str1 . " " . str2 . "`n" . str3

上が単なるスペース連結より分かりやすいかどうかはかなり微妙なような

アドレス演算子

&Var : 変数Varの格納されたメモリ領域のアドレスになる。
*Addr : 整数Addrで表されるメモリ領域のバイト値(0...255)になる。

Cのソース弄らなくなって何年も経つのでポインタの使い方自体うろ覚えなんだけど、*(adr+n) で参照できるのは buf[n]の内容っつーことみたい。

    buf := "abcde"
    adr := &buf
    msgbox, % chr(*(adr+1))     ; 結果:"b" (buf[1])

ちなみに上の場合、バッファ末尾 *(adr+5)には 0(NULL)が入ってる。

しかし *adr := 0x30 とかやってbuf[n]の内容を書き換えようとするとエラーになる。これはどうやったらいいんだろうか、ていうかもしかしてできないのだろうか?
参照だけだといまいち使いみち薄いんだが。DllCall()時用におまけ的につけましたって感じなんだろうか。