タグ

ポインタに関するyowanoのブックマーク (22)

  • POINTER「配列とポインタの完全制覇」「C言語 ポインタ完全制覇」

    タイトルは「C言語 ポインタ完全制覇」。 このページの書籍化とはいえ、内容の大半は書き下ろしですので、 既にWebで読んでおられる方にも決して損はさせません。 詳細はこちらへどうぞ。 「C言語 ポインタ完全制覇(第2版)」書籍情報 「C言語 ポインタ完全制覇」書籍情報(旧版) 技術評論社さんによる書籍案内はこちら。 第2版 旧版 修正履歴は、このページの末尾にあります このページについて 全くもって僭越ながら、恐れおおくも偉そうにも、 こんな文書をWWWで公開させていただくことにしました。 この文書は、もともと社内向けの教科書として作成したものです。 私は、一介の文系出身プログラマであり、 特に情報関係の教育を受けたわけでもなく、 プログラミング言語に深い造詣を持っているわけではありません。 この文書にも多くの誤りや、誤解を招く表現があるかと思います。 そのような記述を見付けられた方は、ぜ

    yowano
    yowano 2014/06/14
    配列とポインタのまとめ。
  • ロベールのC++教室 - 第58章 メンバ関数ポインタ天国2 -

    メンバ関数ポインタの使い方については前回ので問題ありません。今回は、メンバ関数ポインタについての細かい話をしようと思います。 では、今回の要点です。 メンバ関数ポインタは仮想関数の呼び出しも適切に処理してくれる。 メンバ関数ポインタのサイズは int のサイズと同じとは限らない。 では、いってみましょう。 前回はメンバ関数ポインタの文法と使い方について話しただけだったので、先ずは1つ例でも挙げておきましょう。 // Lane.h // 実行レーンクラス template <typename t_Lane> class CLane { private: // enum はクラスの中でも定義できます // int 型の定数を使いたい場合によくやります enum Const{ LaneSize = 16, }; // レーンのサイズ typedef void (t_Lane::*FPLANE)(

    yowano
    yowano 2014/01/03
    メンバ関数ポインタのサイズは int のサイズと同じとは限らない。VC++で試したところ、普通は4、多重継承していれば8、仮想継承していれば12となったが、これは一般にコンパイラに依存する。
  • ゲームつくろ~質問箱 [One Topic All View / Re[4]: vectorとアラインメント(?)について / Page: 0]

    yowano
    yowano 2014/01/03
    __declspec(align('16')) が指定された構造体は、関数の引数に渡せない。(中略)そういう面から見てもやはり、STLコンテナや関数の引数には、ポインタ型を渡すべき。
  • 文字列のメモリ保持期間とポインタについての疑問 - OKWAVE

    場合によります。 >char* s; >s = "abcdefg"; >この"abcdefg"により確保された領域がいつまで保持されるのかわかりません。 >・これを実行しているメソッドを抜けるまでなのか? >・free(s)するまでなのか?(free(s)しなければいけないのか?) この場合は、プログラムがメモリにロードされた時点でメモリ上に"abcdefg"が配置され、 その先頭アドレスを char型のポインタ変数sに代入しているだけです。 # 「文字列リラテル」で検索されるとよいでしょう。 で、メモリ上に配置され"abcdefg"は、プログラムが終了するまで有効ですから解放する必要はありません。 # ちなみに「定数」扱いになりますので普通は書き換えできません。 >オブジェクトを生成して、そのメンバ変数に >obj1->field1 = "value"; >というように格納して利用する

    文字列のメモリ保持期間とポインタについての疑問 - OKWAVE
    yowano
    yowano 2014/01/02
    文字列リテラルは、プログラム終了時まで保存される。char* str = "abcde"; このstrは、文字列リテラルの先頭アドレスを持っているだけ。strの寿命と文字列リテラルの寿命は相関がない。
  • Program Memo - Game Science Wiki

    2013-12-21 論文の書き方 2013-12-10 RecentDeleted 2013-02-18 LaTeXTipsFAQ Bullet 2013-01-17 LaTeX スタートアップ 2012-10-26 LaTeX Tips&FAQ Lua MenuBar TopPage 2012-06-15 SSHのセットアップ 2012-01-31 FK Tips 2011-06-13 研究の進め方 2011-05-19 Program Memo 2011-04-27 研究室運用上の情報 2010-12-06 InterWikiName 2010-11-11 Program Tips 2010-11-03 論文上の細かい注意点 2010-10-21 FrontPage 2008-11-26 SandBox 2006-06-04 PukiWiki/1.4/Manual/Plugin/A-

    yowano
    yowano 2013/11/05
    戻り値ではなく、引数に渡したポインタを通して値を受け取る方式のメリットの解説や、#define MEM2LOC(type, name) type name = this->name; の紹介など。
  • weak_ptr

    yowano
    yowano 2013/10/31
    weak_ptrのままでは保持しているオブジェクトにアクセスできず、キャストやメンバ関数lockを用いてアクセスする。オブジェクトが既に破棄されているかは、戻り値などで判別可ということか。今度試す。
  • アリスはvoid*がお嫌い | Moonmile Solutions Blog

    久々の「アリプラ」シリーズです(自分も忘れていたよ)。 void*にdeleteしてもデストラクタが呼ばれない!? – かずきのBlog@Hatena http://d.hatena.ne.jp/okazuki/20120204/1328323854 というのを見つけて、一瞬「?」と思ったのですが、確かにそうですね。delete するときに void* を渡すと型情報が失われる…というか、delete が型情報を判別できないので、メモリとしか解放されなくてデストラクタが呼び出されません、という現象です。 配列を new したときに、「delete [] ポインタ」 で解放しないといけません。ってのと同じ話だと思います。 #include <iostream> using namespace std; // アリスクラス class Alice { public: Alice() { cou

    yowano
    yowano 2013/10/25
    普通に void* のまま delete してしまうと、デストラクタが呼び出されないが、delete 時に元の型に戻してやると、正常にデストラクタが呼び出される。virtualデストラクタも機能する。
  • deleteを使うときのマクロ - ゲームが作れるようになるまでがんばる日記

    DirectXのサンプルを見ていたら、DXUT.hに確保したメモリを安全に解放するためのマクロがあったので引用。 #ifndef SAFE_DELETE #define SAFE_DELETE(p) { if (p) { delete (p); (p)=NULL; } } #endif #ifndef SAFE_DELETE_ARRAY #define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p)=NULL; } } #endif #ifndef SAFE_RELEASE #define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } } #endifSAFE_RELEASEはインターフェイスの参照カウンタを減少させるもの。カウンタが0になったら解放される。 ポインタがNUL

    deleteを使うときのマクロ - ゲームが作れるようになるまでがんばる日記
  • wstring,string,wchar,char間の変換(C++) - Into the Horizon

    再びc++での文字列処理の話。 c++めんどい(´・ω・`) (2013/12/28) 長らく放置してましたが、結構アクセス数多いので追記。 wstring使うより、pficommonというライブラリをいれてustringを使うのをオススメします。stringを使うのと何も変わらず使えるので。 pficommonは他にも色々便利なので、ぜひ入れてみて下さい。 pficommon : http://pfi.github.io/pficommon/ ■wchar <-> charの変換 mbstowcs, wcstombsを使う。 wchar_t *wc; const char c[] = "あいうえお"; mbstowcs(wc, c, sizeof(c)); ■char <-> stringの変換 string -> char* : c_str()を使う。 char* -> string

    wstring,string,wchar,char間の変換(C++) - Into the Horizon
    yowano
    yowano 2013/09/04
    c -> wc 『mbstowcs()』  wc -> c 『wcstombs()』  c -> s 『=』  s -> c 『c_str()』  s <-> ws 『自作モジュール』
  • 弱い参照 - Wikipedia

    この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方) 出典検索?: "弱い参照" – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL(2011年10月) 弱い参照(英: weak reference、ウィークリファレンス)あるいは弱参照とは、参照先のオブジェクトをガベージコレクタから守ることのできない参照のことである。弱い参照からのみによって参照されるオブジェクトは到達不可能とみなされ、従っていつでも解放することができる。弱い参照は、通常の参照(強い参照、強参照)による諸問題を解決するために用いられる。PythonJavaをはじめとするガベージコレクタを実装したオブジェクト指向プログラミング言語の多くは、弱い参

    yowano
    yowano 2013/08/29
    弱参照からのみによって参照されるオブジェクトは、ガーベジコレクションによっていつでも解放される。循環参照の問題を解決できるほか、オブジェクトがさほど重要ではないということを示すことにも使える。
  • C++11 では NULL ではなく nullptr を使う - C++ プログラミング

    C++ では NULL は 0 で定義されているため、オーバーロードされた関数を呼び出すようなときに予期しない動作をすることがありました。そんな問題を補うために C++11 では nullptr というキーワードが用意されています。 ここでは、従来の NULL と C++11 で規定された nullptr とを比較しながら、それらの使い方について見て行きたいと思います。 NULL や nullptr の効果 NULL や nullptr は、ポインタに格納されている値が「何もない」とか「空である」といった意味を持たせるためのキーワードです。 このようなとき、最終的にはポインタに 0 が代入されるのですけど、例えば次のように単に 0 を代入しただけでは、プログラムには「0 を代入している」以上の意味が込められません。

    yowano
    yowano 2013/08/19
    従来のC++では空のポインタとしてNULLが使われていたが、NULLは単純な0(int型の0)として定義されていたため、いくつかの弊害があった。そのため、新しくnullptrキーワードが追加された。
  • 「ヒープが壊れていることが原因として考えられます。」の原因は二重deleteかも - ginpeiのブログ

    VC++でデバッグ中に HEAP[hoge.exe]: Invalid Address specified to RtlFreeHeap( 00000000, 00000000 ) Windows によって hoge.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えられます。hoge.exe または読み込まれた DLL にバグがあります。 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。 と表示され、msize.cの88行目(下記)でブレーク。 retval = (size_t)HeapSize(_crtheap, 0, pblock); 領域の開放に失敗しているようだが、どうやら既にdeleteしたものをさらにdeleteしようとしたのがよくないようだ。 C++の仕様では、既に開放した領域をdeleteした場合の動作は未定義*1であるらしい。

    「ヒープが壊れていることが原因として考えられます。」の原因は二重deleteかも - ginpeiのブログ
    yowano
    yowano 2013/06/03
    deleteしても領域が開放されるだけで、ポインタがNULLになるわけではない。
  • 参照とポインタ

    この文章はプログラマでもプログラミング言語の専門家でもないただのプログラミング好きの私が適当に書きつづったものです。よってこの文章には正しい箇所もあるでしょうが、間違っている箇所もかなりあるはずです。ご指摘いただけたらと思います。また、この文章を読んでも内容を鵜呑みにしないでください。鵜呑みにした結果何か起きても知りません。 "諸悪の根元"-ポインタ Cの特徴の1つとして、また初心者が必ずつまずく(*)とされる難所としてポインタがあげられるわけだが、ポインタはどうも最新流行のプログラミング手法の中では諸悪の根元として忌み嫌われているようだ。 (*) 自慢するわけではないのだが、私は別にポインタでつまずいた記憶はない。もちろん、効果的な使い方などはその後いろいろなコードを読んでいく中で身に付いていったわけだが。 ポインタは確かに諸刃の剣である。非常に便利な反面、危険でもある。例えば次のような

    yowano
    yowano 2013/06/02
    ポインタと参照の使い分けについて。
  • C/C++ - 言語仕様編 第7回 ~インスタンスとオブジェクト~

    変数の宣言と定数変数型 C++において、変数の宣言は、スコープ内のいたるところで可能となる。 あるT型変数、またはリテラル t1 があるとき、 T const t=t1; のように、型名の後に const をつけると、tは、値としてt1を持ち、かつ、書き換えが出来ない変数となる。これをT型定数変数と呼ぶ。 ここで、tを const T t=t1; と初期化しても、tは、T型定数変数として機能する。このことから、tは、const T型変数であると してもよい。 C++において、定数変数は、それ自身が、リテラルとして機能することが許されるため、 たとえば、配列の要素数として、 int arr[t]={0}; などとして、t個の連続する0からなる配列を構築することが許される。 あるP型ポインタ変数、または、変数のポインタ p に対して、 P* const p1=p; P const* p2=p;

  • 20章 constメンバ変数の初期化 - (void*)Pないと

    http://www.geocities.jp/ky_webid/cpp/language/020.html C++のconstには状況よって様々な効果があるので少しややこしいです。 とりあえずひとつずつ理解していきたいと思います。 まずはC言語的なconstについてですが、これは単にその変数、もしくはその変数が参照している値を変更不可にすることができます。 const int i = 100; // iの値を変更できない int* const p; // pの値を変更できない const int* p; // pが指している値を変更できない const int* const p; // pの値を変更できなくて且つ指してる値も変更できない C++ではこれ以外にconstの役割がかなり増えました。 ひとつずついきましょう。 まずはメンバイニシャライザについてです。 メンバ変数にconstを適

    20章 constメンバ変数の初期化 - (void*)Pないと
  • const修飾子について

    ここでは、私、酒井理雄( TSUGU)がconst修飾子について解説したいと思います。 ご意見やご感想、また、ここおかしいんじゃない?というような所が あれば連絡していただけると作者が喜びます。 constの基 ポインタ変数に対するconst宣言 メンバ変数に対するconst宣言 (作成凍結) メンバ関数に対するconst宣言 TOP C言語においてconst修飾子では指定した変数が定数である(中身を変更 できない)ことを指定します。これによってプログラマの不注意による バグの混入を防ぐことが出来ます。 const修飾子を用いたもっとも簡単な例を次に示します。 const int i = 0; i = 1; //const指定した変数(定数)に値を代入しようとしたため、コンパイルエラー この例のように定数にしたい(値を変更したくない)変数の型名の前に const修飾子を付

    yowano
    yowano 2013/04/23
    ポインタ変数を宣言する時、型名の前にconstを書くとそのポインタ変数の参照先が変更できなくなる。 ポインタ変数自体(格納されているアドレス自体)を定数にしたいときは、*の後にconst修飾子を付ける
  • はてなブログ | 無料ブログを作成しよう

    山形縦断旅行記 2024 夏 この夏、山形に初上陸した。公共交通機関を使う旅行では行くところ、バスや電車に乗る時間を細かく決めてnotionにまとめておくのだけど、今回はレンタカーで移動したので細かい準備がいらず、また多少予定が遅れてもなんとでもなるのでとても楽だった。 関東から山形に…

    はてなブログ | 無料ブログを作成しよう
    yowano
    yowano 2013/04/23
    ポインタに関する解説の端的なまとめと、ポインタを利用したプログラム、実体を利用したプログラムの速度の比較。実体で作成した物をdeleteする、2回deleteするとエラーになるということの具体例。
  • C++初心者です。 とんちんかんな質問をしていたらすみません。…

    C++初心者です。 とんちんかんな質問をしていたらすみません。 A_file.cppとB_file.cppというファイルがあり、それぞれの中でAとBというクラスを定義していると仮定します。 このとき、クラスAのメンバ変数としてBのインスタンスを持たせる場合、ポインタとして定義する方法(以下ソースのmember_pointer_B)と実体を定義する方法(以下ソースのmember_B)があると思いますが、これらの違い(なぜこのような2つの方法があるのか、そもそも言ってることがおかしいとか、使い方が違うとか、メリット・デメリットとか)を教えて下さい。 // ソース class A { int numberA; int numberAA; B* member_pointer_B; // ポインタの定義 B member_B; // 実体の定義 } 宜しくお願い致します。

    yowano
    yowano 2013/04/23
    ポインタがわかりやすく解説されている記事。
  • オブジェクト指向言語では、なぜnewでインスタンスを生成するのでしょうか。C言語の構造体のように、newせずに「クラス名hoge;」を書... - Yahoo!知恵袋

    オブジェクト指向言語では、なぜnewでインスタンスを生成するのでしょうか。C言語の構造体のように、newせずに「クラス名 hoge;」 を書くだけで、インスタンス生成と初期化(newの処理)をしてくれればいいのに。 オブジェクト指向言語では、なぜnewでインスタンスを生成するのでしょうか。C言語の構造体のように、newせずに「クラス名 hoge;」 を書くだけで、インスタンス生成と初期化(newの処理)をしてくれればいいのに。 例えば、 Class Dog { 略 } としてDogを定義して、コードの中で Dog pochi; と書くだけで、pochiインスタンスを生成(コンストラクタの実行)をしてほしいのですが、なぜ pochi = new Doc() みたいに、別途書かなければいけないのでしょうか。

    オブジェクト指向言語では、なぜnewでインスタンスを生成するのでしょうか。C言語の構造体のように、newせずに「クラス名hoge;」を書... - Yahoo!知恵袋
    yowano
    yowano 2013/04/23
    newを使わなかった場合、同一スコープ内でしかそのオブジェクトを使えず、開放も逐次行われる。newを使った場合、メモリが動的に確保されるので、インスタンスが消失せず使い続けられる。ただし開放は自分で。
  • 関数ポインタ

    関数のエントリポイント コンパイラは、コンパイル時に各関数のエントリポイントを作成します プログラムの実効時に関数が呼び出されると、実行制御はこのエントリポイントに移行します エントリポイントは、言わば関数のアドレスです アドレスであるということはポインタ変数をもつことができます 関数ポインタは、アドレスを格納する関数と同じ戻り値の型のポインタ変数を用意します 仮引数がある場合は、続けて仮引数も指定します 宣言時には、優先順位の関係から必ずポインタ名に ( ) をつけます 型 (*変数名) (仮引数); 関数のエントリポイントをポインタに格納すれば、このポインタから関数を呼び出せます こうすることで、間接参照で関数を呼び出しすることができるのです #include <stdio.h> void func(void); int main() { void (*po)() = func; po

    yowano
    yowano 2013/04/19
    関数ポインタを使用することで、関数の配列を実現することができる。関数の配列は、for文などと組み合わせて使うことで有用なものになる。