C ポインタ 新しいページはコチラ
提供: yonewiki
(→ポインタ) |
|||
15行: | 15行: | ||
ざっくりとした仕様でコンピュータの性能を表現しているものが一般的です。<br /> | ざっくりとした仕様でコンピュータの性能を表現しているものが一般的です。<br /> | ||
情報処理用語として1Tと表現した場合1兆0995億1162万7776Byteですが、ざっくり仕様が使われている各種メーカの容量では、実際には10の12乗Byteで995億1162万7776Byte少ないです。<br /> | 情報処理用語として1Tと表現した場合1兆0995億1162万7776Byteですが、ざっくり仕様が使われている各種メーカの容量では、実際には10の12乗Byteで995億1162万7776Byte少ないです。<br /> | ||
− | 仕様書の隅っこに1000kByteを1Byteとして計算していますとか明示してあります。 | + | 仕様書の隅っこに1000kByteを1Byteとして計算していますとか明示してあります。<br /> |
<br /> | <br /> | ||
CPU(Central Processing Unit)とよばれる中央処理装置にも記憶領域があります。キャッシュとよばれています。<br /> | CPU(Central Processing Unit)とよばれる中央処理装置にも記憶領域があります。キャッシュとよばれています。<br /> | ||
71行: | 71行: | ||
定義されている型にしたがって代入したり、内容を取り出したりすることができます。<br /> | 定義されている型にしたがって代入したり、内容を取り出したりすることができます。<br /> | ||
但し、最初に宣言された段階ではint型のアドレスを保持できるだけで、アドレスは保持していません。つまり、その実体、内容つまり中身、も*pintNumと指定したとしても、<br /> | 但し、最初に宣言された段階ではint型のアドレスを保持できるだけで、アドレスは保持していません。つまり、その実体、内容つまり中身、も*pintNumと指定したとしても、<br /> | ||
− | 中身への代入はできません。したがって宣言した直後に * | + | 中身への代入はできません。したがって宣言した直後に *pintNum=10; としてもエラーになります。<br /> |
その問題を解決するのがnew演算子です。new演算子はポインタ変数の型と同じint型で、ポインタが指し示す先頭アドレスの生成と先頭アドレスからint型の分だけメモリ領域を確保し、<br /> | その問題を解決するのがnew演算子です。new演算子はポインタ変数の型と同じint型で、ポインタが指し示す先頭アドレスの生成と先頭アドレスからint型の分だけメモリ領域を確保し、<br /> | ||
ポインタ変数にアドレスを格納します。この結果アドレスの中身の方には名前がない状態ではありますが、ポインタ変数からでのみ操作できる変数が生成されたことになります。<br /> | ポインタ変数にアドレスを格納します。この結果アドレスの中身の方には名前がない状態ではありますが、ポインタ変数からでのみ操作できる変数が生成されたことになります。<br /> | ||
100行: | 100行: | ||
*pintNum=50 | *pintNum=50 | ||
pintNum=00000000001BFC34 //ここの結果はプログラム書き方を変えたり、環境が違うと異なる数字になります。 | pintNum=00000000001BFC34 //ここの結果はプログラム書き方を変えたり、環境が違うと異なる数字になります。 | ||
− | sizeof pintNum=8 | + | sizeof pintNum=8 //ここの結果はプログラムプロジェクト設定や環境が違うと異なる数字になります。 |
</syntaxhighlight> | </syntaxhighlight> | ||
上記のように変数名の前に&をつけるとアドレスを返してくれる。このときの&をアドレス演算子と呼んでいます。<br /> | 上記のように変数名の前に&をつけるとアドレスを返してくれる。このときの&をアドレス演算子と呼んでいます。<br /> | ||
− | + | したがってもともとアドレス変数であるpintNumに対しても&アドレス演算子をつけることができ、アドレス番号を格納しているアドレスが返ります。<br /> | |
プログラム上ではポインタ変数はint型の変数と同じアドレスを見ることで、名前は違っても同じものを指し示すことができるというのが上記の例です。<br /> | プログラム上ではポインタ変数はint型の変数と同じアドレスを見ることで、名前は違っても同じものを指し示すことができるというのが上記の例です。<br /> | ||
+ | <br /> | ||
pintNumのアドレスはポインタ変数のアドレスで&pintNumですが、更に*をつけると*&pintNumとできこれはpintNumと同じになります。<br /> | pintNumのアドレスはポインタ変数のアドレスで&pintNumですが、更に*をつけると*&pintNumとできこれはpintNumと同じになります。<br /> | ||
sizeof関数は、引数に指定した型や値の大きさ、つまりアドレスをいくつ分、使っているのか、使うのかをbyte単位で返却してくれる関数です。<br /> | sizeof関数は、引数に指定した型や値の大きさ、つまりアドレスをいくつ分、使っているのか、使うのかをbyte単位で返却してくれる関数です。<br /> | ||
111行: | 112行: | ||
64bitアプリケーションのプロジェクトならアドレスの大きさは8Byteですから8が返ってきます。<br /> | 64bitアプリケーションのプロジェクトならアドレスの大きさは8Byteですから8が返ってきます。<br /> | ||
64bitPCでもプロジェクト設定がWin32なら4が返ってきます。<br /> | 64bitPCでもプロジェクト設定がWin32なら4が返ってきます。<br /> | ||
− | + | <br /> | |
+ | 64bitPCを使っているPCでVisualStudio2012をお使いの場合には、変更できると思っているのですが、どういった組み合わせなら64bitアプリが作れるかわかっていません。<br /> | ||
+ | それはさておき、プロジェクトの設定をx64(64bit対応)に変更するには<br /> | ||
Visual Studio2012のメニューのプロジェクト(P)->「プロジェクト名(ココも名前の付け方で違うと思います)」のプロパティ(P)<br /> | Visual Studio2012のメニューのプロジェクト(P)->「プロジェクト名(ココも名前の付け方で違うと思います)」のプロパティ(P)<br /> | ||
で表示されるダイアログの右上隅にある 構成マネージャー(O)...を押下して表示されるダイアログで<br /> | で表示されるダイアログの右上隅にある 構成マネージャー(O)...を押下して表示されるダイアログで<br /> | ||
119行: | 122行: | ||
これでx64環境向けのプロジェクトにできます。<br /> | これでx64環境向けのプロジェクトにできます。<br /> | ||
独り言になりますが、プラットフォームにARMも選択できるんすね。<br /> | 独り言になりますが、プラットフォームにARMも選択できるんすね。<br /> | ||
− | + | <br /> | |
アドレス覚えるだけだから、ポインタの宣言で型名なんているの?って思った人はC言語初心者の中でも少し洞察力が高いと思う。残念ながら型名はいります。<br /> | アドレス覚えるだけだから、ポインタの宣言で型名なんているの?って思った人はC言語初心者の中でも少し洞察力が高いと思う。残念ながら型名はいります。<br /> | ||
その指し示しているアドレスからどこまでを変数として使っているかを把握する必要があるからです。代入もできるわけですから<br /> | その指し示しているアドレスからどこまでを変数として使っているかを把握する必要があるからです。代入もできるわけですから<br /> | ||
さらには、変数が配列になっている場合には、インクリメント演算子で次の配列番号に移動できたりもします。<br /> | さらには、変数が配列になっている場合には、インクリメント演算子で次の配列番号に移動できたりもします。<br /> | ||
− | まぁ少しづつ応用していきましょう。 | + | まぁ少しづつ応用していきましょう。<br /> |
− | + | <br /> | |
− | ここではポインタとは何かを理解できればよいと思います。 | + | ここではポインタとは何かを理解できればよいと思います。<br /> |
− | 文字列は配列ありきなので、ポインタの扱いがさらに複雑化してきますし、構造体やクラスのポインタも複雑な操作が必要になります。 | + | 文字列は配列ありきなので、ポインタの扱いがさらに複雑化してきますし、構造体やクラスのポインタも複雑な操作が必要になります。<br /> |