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

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

17
constポインターのポイントは何ですか?
私はconst値へのポインターについて話しているのではなく、constポインター自体について話している。 私は非常に基本的なものを超えてCとC ++を学んでいて、今日まで、ポインタが値によって関数に渡されることに気づきました。これは理にかなっています。つまり、関数内では、呼び出し元からの元のポインターに影響を与えることなく、コピーしたポインターを他の値にポイントできます。 それで、関数ヘッダーがあることの意味は何ですか? void foo(int* const ptr); このような関数の内部では、ptrを他のものにポイントすることはできません。これはconstであり、変更したくないためですが、次のような関数です。 void foo(int* ptr); 同様に仕事をします!ポインタはとにかくコピーされ、コピーを変更しても呼び出し元のポインタは影響を受けないためです。それでは、constの利点は何ですか?
149 c++  c  pointers  const 

11
Javaの関数ポインター
これは一般的で些細なことかもしれませんが、具体的な答えを見つけるのに苦労しているようです。C#にはデリゲートの概念があり、これはC ++からの関数ポインターの概念に強く関連しています。Javaに同様の機能はありますか?ポインタがいくらか欠けていることを考えると、これについての最良の方法は何ですか?明確にするために、ここではファーストクラスについて話します。


16
ポインターの明確化
私はこのチュートリアルに従って、ポインターへのポインターがどのように機能するかについて説明しました。 関連する一節を引用させてください: int i = 5, j = 6, k = 7; int *ip1 = &i, *ip2 = &j; これで設定できます int **ipp = &ip1; and ippはip1を指していiます。*ippis ip1、and、**ippis i、または5です。次のようなおなじみのボックスと矢印の表記法で状況を説明できます。 もしそうなら *ipp = ip2; ipp(ip1)が指すポインターを変更して、のコピーが含まれるip2ようにしip1ましたj。 私の質問は:なぜ第二画像に、されてippまだを指してip1ではなくip2?
142 c  pointers 

23
初心者にCポインター(宣言と単項演算子)を説明する方法は?
私は最近、Cプログラミングの初心者へのポインタを説明することができて、次の困難に遭遇しました。ポインタの使用方法をすでに知っている場合は、まったく問題に見えないかもしれませんが、次の例を明確に考えてみてください。 int foo = 1; int *bar = &foo; printf("%p\n", (void *)&foo); printf("%i\n", *bar); まったくの初心者にとって、出力は意外かもしれません。2行目では、* barを&fooと宣言したばかりですが、4行目では、* barは実際には&fooではなくfooであることがわかります。 混乱は、*シンボルのあいまいさから生じていると言えるかもしれません。2行目では、ポインターの宣言に使用されています。4行目では、ポインターが指す値をフェッチする単項演算子として使用されています。二つの違うことですよね? ただし、この「説明」は初心者にはまったく役立ちません。微妙な食い違いを指摘することで、新しいコンセプトを紹介しています。これはそれを教えるための正しい方法ではありません。 それで、カーニハンとリッチーはそれをどのように説明しましたか? 単項演算子*は間接演算子または逆参照演算子です。ポインターに適用されると、ポインターが指すオブジェクトにアクセスします。[…] ポインターipの宣言は、int *ipニーモニックとして意図されています。それは式*ipがint であると言います。変数の宣言の構文は、変数が出現する可能性のある式の構文を模倣しています。 int *ip「*ipが返されますint」のように読む必要がありますか?しかし、なぜ宣言後の割り当てがそのパターンに従っていないのですか?初心者が変数を初期化したい場合はどうなりますか?int *ip = 1(読み:*ip返されるintとintある1)期待通りに動作しません。概念モデルは首尾一貫していないようです。ここで何か不足していますか? 編集:それはここで答えを要約しようとしました。
141 c  pointers 

16
delete []はどのようにしてそれが配列であることを認識しますか?
了解しました。渡された内容によっては、次のコードで何が起こるかは未定義であることに私たちは皆同意していると思います。 void deleteForMe(int* pointer) { delete[] pointer; } ポインタはあらゆる種類のものである可能性があるため、無条件delete[]で実行することは未定義です。ただし、実際に配列ポインターを渡しているとしましょう。 int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } 私の質問は、ポインターが配列であるこの場合、これを知っているのは誰ですか?つまり、言語/コンパイラの観点からarrは、配列ポインターか単一のintへのポインターかはわかりません。一体、arr動的に作成されたかどうかさえわかりません。しかし、代わりに次のようにすると、 int main() { int* num = new int(1); deleteForMe(num); return 0; } OSは、intを1つだけ削除し、そのポイントを超えて残りのメモリを削除することで、ある種の「強制終了」を行わないほどスマートです(それとstrlen、\0終端されていない文字列とは対照的です-それまでは続きます)ヒット0)。 では、これらのことを覚えておくことは誰の仕事なのでしょうか。OSは何らかのタイプの記録をバックグラウンドで保持しますか?(つまり、何が起きるかは未定義であると言ってこの投稿を始めたことを私は理解していますが、実際、「殺害酒宴」シナリオは発生しないため、実際の世界では誰かが覚えています。)



6
Visual Studioは削除されたポインターをどのように処理しますか、そしてその理由は何ですか?
私が読んでいるC ++の本では、delete演算子を使用してポインターが削除されると、ポインターが指している場所のメモリーが「解放」され、上書きされる可能性があると述べています。また、ポインターが再割り当てされるか、またはに設定されるまで、ポインターは同じ場所を指し続けると述べていますNULL。 ただし、Visual Studio 2012では。これはそうではないようです! 例: #include <iostream> using namespace std; int main() { int* ptr = new int; cout << "ptr = " << ptr << endl; delete ptr; cout << "ptr = " << ptr << endl; system("pause"); return 0; } このプログラムをコンパイルして実行すると、次の出力が得られます。 ptr = 0050BC10 ptr = 00008123 …

14
C / C ++で関数ポインターとデータポインターに互換性がないのはなぜですか?
関数ポインターをデータポインターに変換したり、その逆を行ったりすると、ほとんどのプラットフォームで機能することを確認しましたが、機能するかどうかは保証されていません。これはなぜですか?どちらも単にメインメモリへのアドレスであってはならず、したがって互換性があるべきではないのですか

10
C ++でポインターへの参照を渡す
私の知る限り、C ++でポインターへの参照を渡すことを許可してはならない理由はありません。しかし、私の試みは失敗しており、その理由はわかりません。 これは私がやっていることです: void myfunc(string*& val) { // Do stuff to the string pointer } // sometime later { // ... string s; myfunc(&s); // ... } そして私はこのエラーを得ています: パラメータ1を 'std :: string *'から 'std :: string *&'に変換できません
130 c++  pointers  reference 

10
ポインター式:* ptr ++、* ++ ptrおよび++ * ptr
最近、自分では理解できないこの問題に遭遇しました。 これらの3つの表現は本当に何ですか意味するのでしょうか? *ptr++ *++ptr ++*ptr リッチーを試しました。しかし、残念ながら、彼はこれらの3つの操作について彼が言ったことを追跡することができませんでした。 それらはすべて、ポインタ/ポイントされた値をインクリメントするために実行されることを知っています。評価の優先順位や順序についても多くのことがあると思います。最初にポインターをインクリメントしてからそのポインターのコンテンツをフェッチするように、単純にコンテンツをフェッチしてからポインターをインクリメントするなどです。ご覧のとおり、実際の操作について明確に理解していません。できるだけ早くクリアしてください。しかし、それらをプログラムに適用する機会を得たとき、私は本当に迷っています。例えば: int main() { const char *p = "Hello"; while(*p++) printf("%c",*p); return 0; } 私にこの出力を与えます: ello しかし、私の期待はそれが印刷されることでしたHello。最後の1つのリクエスト-特定のコードスニペットで各式がどのように機能するかの例を教えてください。ほとんどの場合、理論のほんの一部だけが私の頭の上を飛んでいきます。
128 c++  c  pointers  increment 


9
Pythonのポインター?
Pythonにはポインターがないことを知っていますが、2代わりにこの収穫を得る方法はありますか >>> a = 1 >>> b = a # modify this line somehow so that b "points to" a >>> a = 2 >>> b 1 ? ここに例があります:私は常に同じ値を持ちたいform.data['field']と思っform.field.valueています。完全に必要というわけではありませんが、いいと思います。 たとえば、PHPではこれを行うことができます。 <?php class Form { public $data = []; public $fields; function __construct($fields) { $this->fields = $fields; foreach($this->fields as &$field) { …
124 python  pointers 


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