問題タブ [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で文字列をコピーする
私はこのコードについて混乱しています:(http://www.joelonsoftware.com/articles/CollegeAdvice.html)
実行の順序は何ですか?* s = * tが最初に実行され、次にそれぞれが増分されますか?または他の方法?
ありがとう。
編集:そしてそれがあった場合はどうなりますか:
と
c - ポインター演算と配列: 本当に合法的なものは何ですか?
次のステートメントを検討してください。
この段階では、両方のポインターがそれぞれの配列アドレスの先頭を指しています。*pFarr については現在 11 を、*pVarr については 7 を調べています。
同様に、*farr と *varr を介して各配列の内容を要求すると、11 と 7 も取得されます。
ここまでは順調ですね。
pFarr++
では、 と を試してみましょうpVarr++
。偉大な。予想どおり、現在 22 と 8 を見ています。
でも今...
上に移動しようとするfarr++
とvarr++
...「インクリメントする引数の型が間違っています」という結果になります。
これで、配列ポインターと通常のポインターの違いはわかりましたが、動作は似ているのに、なぜこの制限があるのでしょうか?
上記のコードで起こったこととは対照的ですが、同じプログラムで次の関数を表面上は正しい方法と別の間違った方法で呼び出すことができると考えると、これはさらに混乱します。 !?
.
配列ポインターとポインターが一部のコンテキストでは同様に動作するが、他のコンテキストでは異なる理由を誰かが理解するのを手伝ってくれますか?
どうもありがとう。
編集:私のような初心者は、このリソースからさらに利益を得ることができます: http://www.panix.com/~elflord/cpp/gotchas/index.shtml
c++ - ポインターを使用した C++ 演算
私は以下を追加しようとしています:
A を呼び出す double ポインターの配列があります。別の double ポインターの配列を B と呼び、unsigned int を C と呼びます。
だから私はやりたい:
どうすればいいのですか?やった:
私はこれを正しくやっているとは思いません。
編集:私がしたいのは、ダブルポインター配列のインデックス i の値を取得し、そこから int を減算し、その結果をインデックス i のダブルポインター配列に格納することです。
c - offsetof()でnullポインタを減算するのはなぜですか?
Linuxのstddef.hは次のように定義しoffsetof()
ています。
一方、ウィキペディアの記事offsetof()
(http://en.wikipedia.org/wiki/Offsetof)では、次のように定義されています。
(char *)0
なぜウィキペディアバージョンで減算するのですか?それが実際に違いを生むケースはありますか?
c - ポインター演算と符号付き/符号なしの変換!
ポインター演算の場合、整数は自動的に符号付きバリアントに変換されますか? はいの場合、なぜですか?
私がそうするとしましょう
ここで、pointer は int へのポインターであり、uiVal は -1 に初期化されています。次に、ポインターのアドレスが 4 減っていることがわかりました。-1 の符号なし値がここで考慮されないのはなぜですか?
c - C-配列内のポインタをインデックスに変換する方法は?
Cの多くの検索関数(bsearchが思い浮かびます)では、結果が見つかった場合、配列内のスポットへのポインターが返されます。このポインタを検索された配列のインデックスに変換するにはどうすればよいですか(ポインタ演算を使用して、私は推測します)。
c - `*((char*)ptr+4))` は何をしているのですか?
*((char*)ptr+4))
これの目的は何ですか?
c++ - ポインターの減算: この欠落している間接的なレベルはどこから来るのでしょうか?
これに対する MS VC コンパイラの動作を理解するのに苦労しています。この行は正常にコンパイルされますが、得られる結果は私が期待するものとはまったく異なります。
CS1 および CS2 引数は次のように宣言されます。
tCS1 と tCS2 は、それぞれ 1 つの int と 1 つの __int64 を含む構造体です。
これは、両方のポインターである引数 CS1 と CS2 の間のスタック上の距離を確認するためのものです。この行で実行を中断し、デバッガーを使用して 2 つの変数のアドレスを取得すると、実際には互いに 8 バイト離れていることがわかります (x64 プラットフォーム)。
ただし、比較の結果は false です。
コンパイラによって生成されたアセンブリ コードは次のとおりです。
(次に、rdi に格納された結果を使用して比較を行い、呼び出しを行います)
はい、コンパイラはアドレスではなく、ポインター引数の値を比較しています。ここには間接的なレベルがありません。どこに行ったのですか?
もちろん、これをテスト環境で再現することはできず、どこを見ればよいかわかりません。私は 32 ビット マシン上のこのコードを x64 プラットフォームにクロスコンパイルしています (そうしなければなりません)。それが唯一の「奇妙な」点です。アイデア、ヒントはありますか?
delphi - pchar と pbyte の違いは何ですか
この操作を実行できない理由:
c - C の void ポインターのポインター演算
特定の型 (たとえばint
、char
、float
、 ..) へのポインターがインクリメントされると、その値はそのデータ型のサイズだけ増加します。void
サイズのデータを指すポインターがインクリメントされる場合x
、どのようにしてx
バイト先を指すようになりますか? x
コンパイラーは、ポインターの値に追加することをどのように認識しますか?