タグ

pointerに関するyukimori_726のブックマーク (12)

  • メモリ書き込み構文 - 七誌の開発日記

    対象環境を限定できる場合、バイト配列にリトルエンディアンで32bit値を書き込むときに、私は以下のように書いていました。 char buf[32]; *(int *)&buf[6] = 0x12345678; 非常に分かりにくいとご指摘を受けて色々と変形しましたが、どれもしっくり来ません。 ポインタ演算 *(int *)(buf + 6) = 0x12345678; 記述を分割 int *p = (int *)&buf[6]; *p = 0x12345678; アドレスをポインタで表現しているため、キャストに惑わされてメモリ操作のイメージが湧きにくいのではないかと思いました。そこで敢えて即値だけを使い、理屈抜きで基構文として覚えてもらおうという趣旨のスライドを作ってみました。 アセンブリ言語 まずアセンブリ言語でメモリに書き込むコードを提示します。 MOV BYTE PTR[0x0000

    メモリ書き込み構文 - 七誌の開発日記
  • void *とintptr_t - 七誌の開発日記

    今まで何度かvoid *の説明を求められましたが、なかなか納得してもらえませんでした。説明を工夫するだけでは限界があると感じたので、別の方法でどうにかならないかを考えてみました。 前回の記事の延長線上で説明します。サンプルコードを再掲します。 mov byte ptr [0x00000001], 0x12 mov word ptr [0x00000004], 0xfeca mov dword ptr [0x0000000a], 0xefbeadde これを機械的にC言語に書き換えます。 *(char *)0x00000001 = 0x12; *(short *)0x00000004 = 0xfeca; *(long *)0x0000000a = 0xefbeadde; これを提示した意図は、ポインタの意味に深入りしないで、出発点になる基構文を覚えてもらおうということです。 レジスタ アド

    void *とintptr_t - 七誌の開発日記
  • メモリ配置とキャスト – wizaman's blog

    実際に確認してみます。 #include <cstdio> #define PRINT_OBJ(obj) \ printf("%-10s: %08x, %-16s: %2d\n",\ "&"#obj,\ 0,\ "sizeof("#obj")",\ sizeof(obj)); #define PRINT_FIELD(obj, field) \ printf("%-10s: %08x, %-16s: %2d\n",\ "&"#obj"."#field,\ value(&obj.field) - value(&obj),\ "sizeof("#obj"."#field")",\ sizeof(obj.field)); namespace { class Base { public: int a; short b; float c; char d; }; class Sub : public B

  • ポインタ変数を参照渡し - Qiita

    c++ ポインタ変数 参照渡し、と検索しても、 単にポインタ変数を引数にとっている関数の説明か、 ポインタ渡しと、参照渡しの違いについて、しか出てこない。。。 (検索の仕方が悪いかもしれないけど) C++なら、ポインタ渡しとは別に、参照渡しができるから、 ポインタ変数自体も、参照渡しで関数に渡せば、 呼び出し元も、関数側も、形を変えずに処理できる、 と思ったので、やってみた。 以下試した処理とソースコード。 argvの内容を確認し、myargvに必要なメモリ領域を確保し、 argvの内容をコピーして、その内容を表示する。 表示後、確保したメモリ領域を解放する。 この処理を、指定した回数ループ処理する。 コピーした内容の表示は、ループ処理の1回目のみ行う。 最後にプロセスが使用した、最大メモリ使用量を表示する。 ループの回数を変更しても、メモリ使用量が増えないことを確認する。 #includ

    ポインタ変数を参照渡し - Qiita
  • Linuxカーネルのコードを読んで勉強になったこと - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ

    Linuxカーネルのコードを読んでて、なるほど〜と思うことはよくあるけど、その中でも特に今までの考え方をぶち壊してくれたのはなんだっけと思ったところ、やっぱりリスト構造かなと言うところ。 c言語でリスト構造を作る場合、一般的な教科書方式だと↓のようにデータとnextポインタは密結合になってると思います。これの場合、struct foobarのポインタをnext要素に使っているので、他の構造体(例えば、struct hogehoge)で同じことをしようとすると、その構造体ではstruct hogehoge *nextというメンバ変数を持つ必要があります。 ヘッド要素はstruct foobarです。 struct foobar { int n; char s[64]; struct foobar *next; }; struct foobar head; Linuxカーネルの場合、データとリ

    Linuxカーネルのコードを読んで勉強になったこと - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ
  • C++におけるポインタを理解する. 【理解確認問題付き】 - Qiita

    非常にありきたりな問題ですが、ポインタの理解をするのにちょうど良いです。 reverse(char* str)という¥0終端の文字列を逆に並び替える関数を実装せよ。 解法 "abcde"という文字列がインプットとして与えられるとして、考え方は以下です。 ポインタのアドレスを用いてメモリ上の値を実際に更新していくため、このアルゴリズム終了時点で、そのinputに入れた値自体が更新されていることになります。(したのコードでいう、char[][]自体の値が、更新されているということ) 実装例 #include<iostream> class Question { public: static void reverse(char *str) { char* end = str; char tmp; if (str == nullptr) { return; } // 終端のnull文字時点でストッ

    C++におけるポインタを理解する. 【理解確認問題付き】 - Qiita
  • これからC++11を学ぶ君に。生ポとおさらば unique_ptr編 - Qiita

    void hoge(){ char *p = new char[100]; // ここで例外発生したら pはリークしますよ! delete p; } よくある、みつけにくいメモリリークですよね。 ちゃんと try/catch でかこみ finalizeで解放し、例外をthrowし直さないとダメですね 面倒だし、無駄な例外処理が必要になり速度的にも あれですよね。 まずは auto_ptr STLにはauto_ptrというものがあり、スマートポインタとして使われてましたが auto_ptrは deprecated (非推奨、削除予定)なので、 unique_ptr を使いましょう unique_ptrは、昔 boost::scoped_ptrって呼ばれてたやつですね。 ってことで、auto_ptr がダメな理由 #include <iostream> #include <string> #i

    これからC++11を学ぶ君に。生ポとおさらば unique_ptr編 - Qiita
  • 第21章 ポインタを使用できる「安全でないコード」

    21-6 ポインタのサイズ ポインタには、++や--演算子が利用できるが、その際、変化する量はデータ型によって異なる。データ型によって占有するサイズが異なるので、++演算子で次のデータに進めたとき、進む量を変化させる必要があるためだ。List 21-6は具体的なサイズを、sizeof演算子で調べるサンプル・ソースだ。 1: using System; 2: using System.Runtime.InteropServices; 3: 4: namespace Sample006 5: { 6:   [StructLayout(LayoutKind.Sequential,Pack=1)] 7:   struct SampleStruct1 8:   { 9:     public int x; 10:     public sbyte y; 11:   } 12:   [StructLa

    第21章 ポインタを使用できる「安全でないコード」
  • https://github.com/java-native-access/jna/blob/master/src/com/sun/jna/Pointer.java

  • ポインタとメモリと型(構造体)の関係 (1) - C言語 - 碧色工房

    さて、前回までに BMP 形式の読み込み、書き込みを行う関数を紹介しました。 そこで出てきた小技の説明をしたいと思います。 それにはメモリとポインタの関係についての知識が必要ですので、 ポインタの基を説明します。というかこれがすべて。 ポインタというのは C 言語が持っている一つの強力な機能です。 一方で、 C 言語初心者にとって最大の難関ともいえるものです。 しかし、これをマスターしてしまえば非常に便利で、様々な応用ができるようになります。 (実際ポインタだけで1冊のが出ているくらい奥が深いもの) まあ、いいことばかりではなくて、ポインタは使い方を誤ると非常に危険な諸刃の刃です・・・ (ポインタはバグの宝庫とまで呼ばれてたりする) あと、注意事項として以下でプログラムを書いて実行していますが。この結果は処理系依存となります。 このような結果になるという前提でプログラムを書くと、移植性

    ポインタとメモリと型(構造体)の関係 (1) - C言語 - 碧色工房
  • 関数ポインタを返す関数 - 素人がプログラミングを勉強していたブログ

    [09/04/21 23:17:19] qnighy/Acike: C言語で [09/04/21 23:17:31] qnighy/Acike: 関数ポインタを返す関数って [09/04/21 23:17:40] qnighy/Acike: どうやって宣言すればいいのかわからない [09/04/21 23:18:23] daiki chijiwa: っvoid * [09/04/21 23:18:38] qnighy/Acike: とりあえず、typedefとかvoid*とかはなしで [09/04/21 23:19:18] qnighy/Acike: 関数ポインタの型宣言を関数の戻り値にたいして行う書き方をしりたい [09/04/21 23:21:49] 糸柳: typedef 無しでできるのかな[09/04/21 23:29:22] つっくん(javascripter):int f()

    関数ポインタを返す関数 - 素人がプログラミングを勉強していたブログ
  • ポインタ虎の巻

    ポインタ虎の巻 初級篇~ポインタはなぜ難しいか? C言語を学ぶ上で、ほとんどの人が引っかかり、往々にCの勉強を放棄するきっかけとなるのがポインタである。しかし、ポインタはC言語という特定のプログラム言語だけではなく、コンピュータというものを理解する上で、必要不可欠な重要な機能である。C言語参考書では、ポインタを解説する上で「箱」のモデルを使って解説することが多いが、この虎の巻では、より突っ込んだ具体的な動作を解説することでポインタというものの質を解明して見ようと思う。参考書ではC言語の抽象レベルの上で解説がされるのが通例だが、虎の巻では単純化されたアセンブリ命令を使って具体的に解説する。 初級篇目次 変数とは何か? 疑似アセンブリの定義 文字列の処理 アドレスの取得 ポインタの型 関数呼び出しの手法 構造体とポインタ リスト構造 NEW 二進木 NEW 中級篇~ポインタの高度な技 ポイン

  • 1