問題タブ [pointer-arithmetic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#でのポインター計算
ピンボークコードを使用してC関数を呼び出そうとしています。この関数は、バッファーをデータで満たします。
構造は、長さのDWORDとして設定され、その後に文字列が続きます。IntPtrから文字列を抽出するにはどうすればよいですか?
objective-c - Cでのポインタ演算と添字による配列値へのアクセス
私は、Cでは、ポインター演算を使用する方が、配列アクセスの添え字よりも一般的に高速であることを読み続けています。これは、最新の(おそらく最適化されている)コンパイラーでも当てはまりますか?
もしそうなら、私がCの学習からObjective-CとMacのCocoaに移行し始めたとき、これはまだ当てはまりますか?
CとObjective-Cの両方で、配列アクセスに適したコーディングスタイルはどれですか?(それぞれの言語の専門家によって)より読みやすく、より「正しい」(より良い用語がないため)と見なされるのはどれですか?
c - 配列の場合、なぜ a[5] == 5[a] になるのですか?
Joel がStack Overflow ポッドキャスト #34で指摘しているように、C プログラミング言語(別名: K & R) では、C の配列のこのプロパティについて言及されています。a[5] == 5[a]
ジョエルはポインタ演算が原因だと言っていますが、私にはまだわかりません。なぜa[5] == 5[a]
ですか?
c - ポインター演算
ポインター演算に関する優れた記事や説明 (ブログ、例) はありますか? 聴衆は、C および C++ を学習している Java プログラマーの集まりであると考えてください。
c - ポインター演算が配列の添え字付けよりも望ましい説得力のある例は何ですか?
私は C クラスの入門用にいくつかのスライドを準備しており、配列添字よりもポインター演算を使用するための良い例 (および動機) を提示しようとしています。
私が本で目にする多くの例は、かなり同等です。たとえば、多くの書籍では、文字列内のすべての値の大文字と小文字を逆にする方法が示されていますが、a[i] を *p に置き換えることを除いて、コードは同じです。
ポインター演算がはるかに洗練されたコードを生成できる、1 次元配列の良い (そして短い) 例を探しています。何か案は?
c - C のポインター演算
次のコード フラグメントを検討してください。
私はポインタ演算がインテリジェントであることを知っています。つまり、操作が次の 3 整数配列を指すのに十分なバイト数だけ先にq++
進むことを意味します。そのため、最初の出力が ' ' であることq
は驚くことではありません。12, 0
q
しかし、2 番目のプリントは私を驚かせます。1が印刷されます!
では、なぜ 12 ではなく 1 を出力するのでしょうか? それは私を困惑させるだけです。
c - ポインタ減算アンダーフローを持つ C コンパイラはどれですか?
そのため、 Michael Burrのこの回答へのコメントから学んだように、C 標準では、配列の最初の要素 (割り当てられたメモリが含まれていると思われます) を過ぎたポインターからの整数減算はサポートされていません。
結合された C99 + TC1 + TC2 (pdf)のセクション 6.5.6 から:
ポインターオペランドと結果の両方が同じ配列オブジェクトの要素を指している場合、または配列オブジェクトの最後の要素の 1 つ後ろを指している場合、評価はオーバーフローを生成しません。それ以外の場合、動作は未定義です。
私はポインター演算が大好きですが、これはこれまで心配したことはありませんでした。私はいつもそれを仮定してきました:
それc == a
。
だから、私は以前にそのようなことをしたことがあり、噛まれたことはないと信じていますが、それは私が働いてきたさまざまなコンパイラの親切さによるものに違いありません.私が思っていたようにポインター演算を機能させます。
だから私の質問は、それはどのくらい一般的ですか? 私のためにその親切をしない一般的に使用されるコンパイラはありますか? 配列の境界を超えた適切なポインター演算は事実上の標準ですか?
c++ - ポインターが逆参照されない場合でも、最後から3番目のポインターのハードウェアトラップはどのように発生しますか?
2005年11月1日のC++コラムで、ハーブサッターは次のように書いています...
[O]現在のCPUアーキテクチャを含む一部のCPUアーキテクチャでは、前述のコードにより、ポインタが逆参照されているかどうかに関係なく、最後から3番目のポインタが作成された時点でハードウェアトラップが発生する可能性があります。
CPUはビットパターンをどのようにトラップしますか?どうですか...
ボーナスの質問:「一部の現在のCPUアーキテクチャ」というフレーズは、通常、製品の出荷のみを指すと理解する必要がありますか、それとも、それらが説明または暗示されているフィクションの作品に最近の発行日がある場合は、架空のアーキテクチャも含まれますか?
c - 構造体サイズの半分で構造体ポインタを増やします
対処すべき興味深い問題が発生しましたが、それをうまく解決する方法がわかりません。
複雑なグラフを表す 2 つの基本データ構造があり、次のように宣言されています。
実際のノードはヘッダーの直後に配置されるため、通常、「graph_t」は次のように作成されます
ノードの「生の」配列には、次のようにアクセスします
現在、ノード数を削減するバッファ上で動作するサポート関数があります。次のようになります。
さて、これは長い間美しく機能しています。上記のエラーは、私が記憶から書いているという事実から来ています。アイデアを説明しようとしているだけです。
今私を困惑させているのは、新しいモジュールからリダクション関数を使用すると、入力が「適切に」調整されないことです。アドレスを調べると、次のプロパティに注意してください。
もちろん、「オフセット」値が正しくなくなるため、少し問題が発生しますが、データ構造の他のすべての使用が機能するため、それほど明白ではありません (「実際の」アライメントの問題はありません)。
私の質問に要約すると、オフセットを要素の整数として表現できない場合に、ポインターをインクリメントするきちんとした方法がわかりますか?
過度のキャストに頼らない方法を見つけるためのボーナスポイント:)