スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ほんの些細な数時間? 「配列は本当にポインタなのか?」の話

 今日、普通にクラス設計を考えていた時のことなのですが、
int a[] = {1,2,3,4,5};
int *b = a;
for(int view : b)
std::cout << view << std::endl;
みたいなことできないかなーと考えていたのですよ。

 なんだかあらゆるどこかで「配列はポインタ」と聞いていたので、
配列変数の持つアドレス普通のポインタに移す
なぜイテレータが削除されているのか!!と。

 先ほどの例で言うと
int a[] = {1,2,3,4,5};
int *b = a;


for(int view : a)
std::cout << view << std::endl;
はできるのに
int a[] = {1,2,3,4,5};
int *b = a;
for(int view : b)
std::cout << view << std::endl;
はできない。
というやつ。


 もっと突き進めてみる。
そもそもあれを実現するにはfor each(拡張for)でなくて
int a[] = {1,2,3,4,5};
int *b = a;
const int LEN = sizeof(b)/sizeof(b[0]);
for(int i=0; i<LEN; i++)
std::cout << b[i] << std::endl;
ができれば十分!

 でもできない。
ということは
「本当に『配列』『ポインタ』等価なのか!?
ということになるのですよ…。

 結論から言うと一部分違いました
解答(?)は以下。
  1 #include 
2 #include
3
4 auto main() -> int {
5 »___int a[] = {1,2,3,4,5};
6 »___int *b = a;
7 »___std::cout << a << std::endl
8 »___»___»___ << b << std::endl
9 »___»___»___ << (a == b) << std::endl
10 »___»___»___ << (sizeof(a) == sizeof(b)) << std::endl
11 »___»___»___ << (typeid(a) == typeid(b)) << std::endl
12 »___»___»___ << typeid(a).name() << " " << typeid(b).name() << std::endl;
13 };


 出力結果はこの通りです。(表記をbool型に変えてあります 1=>true)
0x7fff55b0f320  // aの参照先アドレス
0x7fff55b0f320 // bの参照先アドレス
true // a == b
false // aのbitサイズ != bのbitサイズ
false // aの型 != bの型
A5_i Pi // aの型名, bの型名

A5_iというのは「Array Size[5] Integer」でしょうか。
Piも多分「Pointer Integer」。
試しにaを
int a[] = {1,2,3,4,5,6};
に変えてみると、
typeid(a).name()も「A6_i」に変わりました

ってことはさ…
「『配列』は『ポインタ』」じゃないじゃん!!

配列はポインタとしての扱いも受けますが、イテレータ( begin()やend() )も持ちますよ

ってことですね。


…typeid(a)とtypeid(b)を比較してみる、ということにたどり着くまで結構かかってしまいました……。
スポンサーサイト

Rot13をVimで扱うジョークスクリプト作りました。

うん、
ずっと前に作ったVim scriptをいろいろやって半ば完成に至ったので公開します。
https://github.com/aiya000/arot13.vim.git

参考にさせていただいた記事は以下、その他もろもろです。
http://cohama.hateblo.jp/entry/20130403/1364999731
http://d.hatena.ne.jp/osyo-manga/20121201/1354288903

デバッグにはVimConsoleを使わせていただきました。
http://qiita.com/rbtnn/items/89c78baf3556e33c880f


ところで結局Vim scriptは
VimScriptなの?
Vim scriptなの?
vim scriptなの?
Wikipediaさんは「Vim sciprt」と言っていますので、私信じます。

私、本当にVimmer名乗っていいの?
な、名乗っちゃうもんね!!!
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。