タグ

配列に関するyowanoのブックマーク (6)

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

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

    yowano
    yowano 2014/06/14
    配列とポインタのまとめ。
  • 配列フィールドを返すメソッド - 星一の日記

    yowano
    yowano 2014/03/11
    配列のフィールドをそのまま返すと、要素が書き換えられてしまう可能性があるため、読み取り専用にしたい場合にはそぐわない。代わりに、配列のコピーを返すか、ReadOnlyCollectionクラスを使う。
  • 循環バッファ

    概要 「配列リスト」は、 要素へのランダムアクセスが非常に高速という利点がある一方、 末尾以外への要素の挿入が極端に遅いという欠点がありました。 用途によってはこれでも十分なのですが、 ある用途においては、末尾だけでなく先頭にも要素の挿入・削除を行いたい場合があります。 そこで、先頭と末尾の要素の挿入・削除を高速に(オーダー O(1) で)行えるデータ構造として、 循環バッファ(circular buffer)という物が考えられています。 循環バッファはリングバッファ(ring buffer)等とも呼ばれます。 循環バッファは、その名前の通り、 配列の先頭と末尾を繋いだ環のようなイメージのデータ構造です(図1)。 循環バッファ 特徴 循環バッファは以下のような利点を持っています。 「配列リスト」と同様に、高速な(オーダー O(1))ランダムアクセスが可能。 先頭および末尾への要素の追加・削

    循環バッファ
    yowano
    yowano 2013/11/20
    O(1)でランダムアクセスが可能で、且つ先頭および末尾への要素の追加・削除がO(1)で行える環状のバッファを作成する方法。
  • signed intでの配列アクセスはマジヤバイ(こともある) - memologue

    次のC/C++なコードには問題があります。 #define A_SIZE 6 static int a[A_SIZE]; void vuln(int n, int val) { assert(n < A_SIZE); a[n] = val; }配列アクセスの添字となる変数aの方が signed int なのが問題です。nとして負数を渡すと面白い(というか恐ろしい?)動作をします。 ええと・・(int)(0x80000000U + n) を vulnの第一引数として渡すと*1、vuln内の配列xのx[n]に書き込むことができてしまうのです。もちろん、配列の境界チェックは行われません。だから、 int main(void) { // test1: a[4] = 123; と同じ。 // これはまぁ配列の範囲内だからいいけど・・ vuln(0x80000004U, 123); // test2:

    signed intでの配列アクセスはマジヤバイ(こともある) - memologue
    yowano
    yowano 2013/10/28
    配列の添字が signed int型 の場合、添字に負数を指定することができてしまい、結果として危険なメモリ書き換えを許してしまう。そのため、配列の添字は size_t型 を使うとより良い。
  • データ型のアラインメントとは何か,なぜ必要なのか?

    以前このサイトとブログに,何度かアラインメントに関する記事を書きました (サイト内関連ページ参照). そのせいか「アラインメント」で検索して来てくれる人が多いので, 過去の記事に加筆修正してこのページを新たに作成しました. 加筆した点は次のとおりです. アラインメントとメモリアクセス回数の関係をわかりやすくするため, (ほんの少し) 図を導入しました. 「データがアラインされていないとメモリアクセス回数が増える」 と言葉で説明しているサイトは多いのですが, 図で示しているところはまだ見たことありません. アラインされていないアドレスにデータを書き込む場合, 読み出しの場合以上にメモリアクセス回数がかかる可能性があることを追記しました. 以前は「複合データ型 (配列,構造体,共用体) のアラインメント」はほとんど自明のことだと思っていたので軽く流していましたが, 意外なことにこれを解説してい

    yowano
    yowano 2013/09/10
    プログラミング言語(というよりハードウェア)におけるアラインメントの意味から、その存在理由、注意点まで、詳細丁寧な解説。
  • クラスオブジェクトの配列を使うときの注意点 - ソフトウェアエンジニア現役続行

    int型の配列を使うときは以下のようにします。これは問題ないですね。 int[] array = new int[10]; // (1) しかし自分で定義したクラスのオブジェクトの配列を使う場合は、同じようにしてもうまくいきません。 class NewClass{ int a; int b; } public static void main(String[] args) { NewClass[] dim = new NewClass[3]; // (2) dim[0].a = 1; dim[0].b = 10; dim[1].a = 2; dim[1].b = 20; dim[2].a = 3; dim[2].b = 30; } (1)と同様に(2)と書いたのに、これを実行するとNull Pointer Exceptionが発生してしまいます。 調べたところ、(2)は、オブジェクトを入れ

    クラスオブジェクトの配列を使うときの注意点 - ソフトウェアエンジニア現役続行
    yowano
    yowano 2013/04/17
    newでインスタンスを入れるための配列を作ったあとに、次はfor文を利用しnewでインスタンスを生成、配列にインスタンスを格納と、一つずつやっていかなければならない
  • 1