タグ付けされた質問 「pointers」

メモリに格納されている別の値を「指す」データ型。ポインタ変数には、他のエンティティ(変数または関数または他のエンティティ)のメモリアドレスが含まれています。このタグは、参照ではなくポインタの使用を含む質問に使用する必要があります。ポインターを使用する最も一般的なプログラミング言語は、C、C ++、Go、およびアセンブリ言語です。特定の言語タグを使用します。他の有用なタグは、メソッド、関数、構造体などで、ポインタの使用を説明しています。


16
参照とポインターを使用する場合
ポインタと参照の構文と一般的なセマンティクスを理解していますが、APIで参照またはポインタを使用することが適切かどうかをどのように判断すればよいですか? 当然、状況によってはどちらか一方が必要です(operator++参照引数が必要です)が、変数が破壊的に渡されていることは構文上明らかであるため、一般的にはポインタ(およびconstポインタ)を使用した方がよいと思います。 たとえば、次のコードで: void add_one(int& n) { n += 1; } void add_one(int* const n) { *n += 1; } int main() { int a = 0; add_one(a); // Not clear that a may be modified add_one(&a); // 'a' is clearly being passed destructively } ポインターを使用すると、何が起こっているのかが常に(さらに)明白になります。そのため、APIなどでは、明確さを重視する場合、ポインターは参照よりも適切ではありませんか?つまり、参照は必要な場合にのみ使用する必要があるということoperator++ですか(例:)?どちらか一方にパフォーマンスの問題はありますか? 編集(古い): NULL値を許可して生の配列を処理する以外に、選択は個人の好みに帰着するようです。GoogleのC ++スタイルガイドを参照する以下の回答を受け入れました。「値の構文はあるがポインタのセマンティクスがあるため、参照は混乱を招く可能性がある」という見解を示しているためです。 NULLであってはならないポインタ引数をサニタイズするために必要な追加の作業(たとえばadd_one(0)、実行時にポインタバージョンを呼び出して中断する)のため、オブジェクトが存在しなければならない参照を使用することは保守性の観点からは残念ですが、意味があります。構文の明確さを失う。
381 c++  pointers  reference 

11
JavaScriptでのオブジェクトの削除
私はJavaScriptのdelete演算子と少し混乱しています。次のコードを見てください。 var obj = { helloText: "Hello World!" }; var foo = obj; delete obj; このコードが実行された後、objisですがnull、fooそれでもとまったく同じようにオブジェクトを参照しますobj。このオブジェクトは、foo指し示したオブジェクトと同じだと思います。 これは私を混乱させます。なぜなら、書き込みdelete objでobjは、変数だけでなく、メモリ内を指しているオブジェクトも削除されると思っていたからですobj。 JavaScriptののガベージコレクタは、私がオブジェクトを指し、他の変数を持っていなかった場合は、それがそうすることを、保持/解放的に取り組んでいるためですでしょうメモリから削除されますか? (ちなみに、私のテストはSafari 4で行われました。)

17
なぜポインタを使用するのですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 これは本当に基本的な質問ですが、高級言語でいくつかのプロジェクトをコーディングした後、基本的なC ++プログラミングから始めました。 基本的に私は3つの質問があります: 通常の変数でポインタを使用する理由 いつ、どこでポインタを使用すればよいですか? 配列でポインタをどのように使用しますか?
356 c++  c  pointers 

4
パラメータと戻り値のポインタと値
Goでは、struct値またはそのスライスを返すさまざまな方法があります。私が見た個々のものについて: type MyStruct struct { Val int } func myfunc() MyStruct { return MyStruct{Val: 1} } func myfunc() *MyStruct { return &MyStruct{} } func myfunc(s *MyStruct) { s.Val = 1 } これらの違いを理解しています。1つ目は構造体のコピーを返し、2つ目は関数内で作成された構造体値へのポインタ、3つ目は既存の構造体が渡されることを期待して値をオーバーライドします。 これらのパターンのすべてがさまざまなコンテキストで使用されるのを見てきましたが、これらに関するベストプラクティスは何なのでしょうか。どちらを使用しますか?たとえば、最初のものは小さな構造体で問題がなく(オーバーヘッドが最小限であるため)、2つ目はより大きな構造体で問題ありません。また、呼び出し間で単一の構造体インスタンスを簡単に再利用できるため、非常にメモリ効率を高めたい場合は3番目。どれを使用するかについてのベストプラクティスはありますか? 同様に、スライスに関する同じ質問: func myfunc() []MyStruct { return []MyStruct{ MyStruct{Val: 1} } } func myfunc() []*MyStruct { return []MyStruct{ …
329 pointers  go 

15
2D配列をC ++関数に渡す
可変サイズの2D配列をパラメーターとして取りたい関数があります。 これまでのところ私はこれを持っています: void myFunction(double** myArray){ myArray[x][y] = 5; etc... } そして、私は私のコードの他の場所で配列を宣言しました: double anArray[10][10]; ただし、電話myFunction(anArray)をかけるとエラーが発生します。 渡すときに配列をコピーしたくありません。変更を加えるとmyFunction、の状態が変わるはずですanArray。私が正しく理解していれば、2D配列へのポインタを引数として渡したいだけです。関数は、異なるサイズの配列も受け入れる必要があります。たとえば、[10][10]そして[5][5]。これどうやってするの?

13
'sizeof'(配列を指すポインター)を見つける方法は?
まず、ここにいくつかのコードがあります: int main() { int days[] = {1,2,3,4,5}; int *ptr = days; printf("%u\n", sizeof(days)); printf("%u\n", sizeof(ptr)); return 0; } ptr(32ビットシステムでは4バイトであるサイズを指定する代わりに)指している配列のサイズを確認する方法はありますか?
309 c  arrays  pointers  sizeof 

11
NULL、 '\ 0'、0の違いは何ですか?
- Cにおいては、様々なゼロの値の差があるように思われるNULL、NULと0。 ASCII文字'0'が48またはに評価されることを知ってい0x30ます。 NULLポインタは、通常のように定義されます。 #define NULL 0 または #define NULL (void *)0 また、評価しそうNULなキャラもいます。'\0'0 これら3つの値が等しくない場合がありますか? これは64ビットシステムにも当てはまりますか?
309 c  pointers  null 


9
Cのポインター:アンパーサンドとアスタリスクを使用する場合
私はポインタから始めたばかりで、少し混乱しています。私が知っているの&は変数のアドレスで*あり、これはポインター変数の前で使用して、ポインターが指すオブジェクトの値を取得できます。しかし、配列、文​​字列を操作しているとき、または変数のポインターコピーを使用して関数を呼び出しているときは、動作が異なります。これらすべての中のロジックのパターンを見るのは難しいです。 ときに私が使用する必要があります&と*?
298 c  pointers 


11
C ++で新しいキーワードを使用する必要があるのはいつですか?
しばらくC ++を使用していて、新しいキーワードについて疑問に思っていました。単に、私はそれを使うべきか、そうでないのか? 1)新しいキーワードで... MyClass* myClass = new MyClass(); myClass->MyField = "Hello world!"; 2)新しいキーワードなし... MyClass myClass; myClass.MyField = "Hello world!"; 実装の観点からは、それらはそれほど異なっていないように見えます(しかし、確かに違います)...しかし、私の主要言語はC#であり、もちろん最初の方法は私が慣れているものです。 問題は、方法1がstd C ++クラスで使用するのが難しいことです。 どの方法を使用する必要がありますか? 更新1: 私は最近、スコープから外れる(つまり、関数から返される)大きな配列のヒープメモリ(またはfree store)に新しいキーワードを使用しました。以前はスタックを使用していたため、要素の半分がスコープ外で破損していましたが、ヒープの使用に切り替えることで、要素が正常に機能するようになりました。わーい! アップデート2: 私の友人は最近、newキーワードを使用するための簡単なルールがあると私に言った。タイプするたびにnew、タイプしてくださいdelete。 Foobar *foobar = new Foobar(); delete foobar; // TODO: Move this to the right place. これは、常に削除をどこかに置く必要があるため(つまり、切り取りしてデストラクタなどに貼り付ける場合)、メモリリークを防ぐのに役立ちます。


3
Cに矢印(->)演算子が存在するのはなぜですか?
ドット(.)演算子は、構造体のメンバーにアクセスするために使用され->、Cの矢印演算子()は、問題のポインターによって参照される構造体のメンバーにアクセスするために使用されます。 ポインター自体には、ドット演算子を使用してアクセスできるメンバーはありません(実際には、仮想メモリ内の場所を表す数値にすぎないため、メンバーはありません)。したがって、ポインターで使用される場合にポインターを自動的に逆参照するようにドット演算子を定義した場合でも、あいまいさはありません(コンパイラーがコンパイル時に知っている情報)。 では、言語の作成者が、この一見不要に見える演算子を追加することで、物事をより複雑にすることに決めたのはなぜですか?大きな設計上の決定は何ですか?
264 c  pointers  dereference 

12
Cでの矢印演算子(->)の使用法
「Teach Yourself C in 21 Days」という本を読んでいます(すでにJavaとC#を習得しているので、ずっと速いペースで動いています)。ポインタの章を読んでいたところ、->(矢印)演算子が説明なしに表示されました。メンバーと関数を呼び出すために使用されていると思います.((ドット)演算子と同等ですが、メンバーではなくポインター用です)。しかし、私は完全にはわかりません。 説明とコードサンプルを入手できますか?
257 c  pointers  syntax 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.