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

ポインタは、その値を使用してコンピュータメモリの別の場所に格納されている別の値を直接参照する(または「ポイントする」)データ型です。

11
Cのvoidがvoidではないのはなぜですか?
JavaやC#などの厳密に型指定された言語では、メソッドの戻り値型としてvoid(またはVoid)を意味するようです: このメソッドは何も返しません。なし。返品不可。このメソッドからは何も受け取りません。 本当に奇妙なのは、Cではvoid、戻り値の型として、またはメソッドのパラメーターの型としても、 それは本当に何でもありえます。調べるには、ソースコードを読む必要があります。がんばろう。それがポインタである場合、あなたは何をしているかを本当に知っている必要があります。 Cの次の例を検討してください。 void describe(void *thing) { Object *obj = thing; printf("%s.\n", obj->description); } void *move(void *location, Direction direction) { void *next = NULL; // logic! return next; } 明らかに、2番目のメソッドはポインターを返しますが、これは定義上何でもかまいません。 CはJavaやC#よりも古いので、なぜこれらの言語はvoid「何も」を意味するものとして採用したのに、Cは「何も何も(ポインターの場合)」として使用しませんでしたか?
25 c  pointers 

4
キロバイトブロックとポインターのすべての可能な順列のメモリは可能ですか?
これは頭​​をかき回すのに十分なほど難しい考えであり、編集/ヘルプを知っている人にとって読みやすくするためにどんな編集/ヘルプも大いに感謝します。 理論上、1キロバイトのすべての可能なバイナリ順列のコピーを1つ保存したハードドライブを使用し、システムの残りの部分にこれらの場所へのポインターを作成させることは可能ですか? このような方法で作成されたシステムは、単に情報を直接保存するよりも速いでしょうか? 別の方法を説明するには、文章を書く代わりに次のように言います。 「こんにちは、ボブです。」「そのサンドイッチは美味しそうです。」 ...ハードドライブに保存すると、アルファベットやその他の文字のすべての順列が最大数(たとえば1000文字程度)になり、次のような文が保存されます。 [ポインター#21381723]

10
ポインター/再帰の難しさは何ですか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 Javaスクールの危険の中で、ジョエルはペンでの経験と「セグメンテーションフォールト」の難しさについて話します。彼は言い​​ます [セグメンテーション違反はあなたまで難しい]「深呼吸をして、同時に2つの異なる抽象化レベルで心を働かせようとする。」 セグメンテーション違反の一般的な原因のリストを考えると、2つの抽象化レベルでどのように作業する必要があるのか​​理解できません。 なんらかの理由で、Joelはこれらの概念をプログラマーが抽象化する能力の中核と考えています。あまり思い込みたくありません。それでは、ポインタ/再帰について何がそんなに難しいのでしょうか?例はいいでしょう。
20 c  pointers  recursion 

4
C#でポインタを実際に使用していますか?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 ポインターを使用することが良いまたは必要なオプションであるC#でコーディングしているときの状況は何ですか?安全でないポインターについて話している。
19 c#  pointers 

3
ポインターが危険と見なされるようになったのはいつですか?
プログラミング言語でのポインターの使用については、ポインターが危険であると一般に受け入れられるようになった(完全な「悪」または類似の拡大ではない場合)と考えられるようになったようです。 この考え方の変化の歴史的発展は何でしたか?特定の独創的な出来事、研究、または他の開発がありましたか? たとえば、CからC ++、Javaへの移行を表面的に振り返ると、ポインタを参照で補完し、完全に置き換える傾向が見られるようです。しかし、実際のイベントチェーンはおそらくこれよりもはるかに微妙で複雑であり、それほど連続的ではありません。それらを主流言語にした機能は、おそらくずっと前に他の場所で生まれた可能性があります。 注:ポインター対参照対他の実際のメリットについては質問していません。私の焦点は、この明らかな変化の理論的根拠にあります。
18 history  pointers 

4
Cポインターの優先順位はどのように決定されますか?
私は理解に苦労している2つのポインタ宣言に遭遇しました。優先ルールの私の理解は次のようになります。 Operator Precedence Associativity (), [ ] 1 Left to Right *, identifier 2 Right to Left Data type 3 しかし、これを与えられても、次の例を正しく評価する方法を理解することはできないようです。 最初の例 float * (* (*ptr)(int))(double **,char c) 私の評価: *(ptr) (int) *(*ptr)(int) *(*(*ptr)(int)) 次に、 double ** char c 2番目の例 unsigned **( * (*ptr) [5] ) (char const *,int *) *(ptr) …
14 c  pointers 



4
ポインターのインデックス付け
現在、「Numerical Recipes in C」というタイトルの本を読んでいます。この本では、著者は、1で始まるインデックスがある場合に特定のアルゴリズムが本質的にどのように機能するかを詳しく説明しています(私は彼の議論に完全には従わず、この投稿のポイントではありません)が、Cは常に0で始まる配列にインデックスを付けますこれを回避するために、彼は単に割り当て後にポインタをデクリメントすることを提案します、例えば: float *a = malloc(size); a--; これは、1で始まるインデックスを持つポインターを効果的に提供し、その後で解放されると彼は言います: free(a + 1); ただし、私が知る限り、これはC標準による未定義の動作です。これは明らかにHPCコミュニティ内で非常に評判の良い本なので、彼の言っていることを単に無視したくはありませんが、割り当てられた範囲外のポインターを単にデクリメントすることは私には非常に大雑把です。これはCの「許可された」動作ですか?私はgccとiccの両方を使用してテストしましたが、これらの結果はどちらも私が何も心配していないことを示しているように見えますが、絶対にポジティブになりたいです。
11 c  pointers 

8
ポインタの使用例と利点は何ですか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 6年前休業。 ポインタの利点を理解するのに苦労します(低レベルのプログラミングを除く)。 Stringやchar []の代わりにchar *を使用する理由、またはポインター演算がもたらす利点 では、ポインタの利点と使用例は何ですか?
10 pointers 

1
最新のC ++へのキー/バリューストア開発の移植
Cassandraに似たデータベースサーバーを開発しています。 開発はCで始まりましたが、クラスがなければ非常に複雑になりました。 現在、私はすべてをC ++ 11に移植しましたが、まだ「モダンな」C ++を学習しており、多くのことについて疑問があります。 データベースはキー/値のペアで動作します。すべてのペアにはさらに多くの情報があります。いつが作成され、いつ期限切れになるか(期限切れでない場合は0)。各ペアは不変です。 キーはC文字列、値はvoid *ですが、少なくとも今のところ、値をC文字列として操作しています。 抽象IListクラスがあります。3つのクラスから継承 VectorList -C動的配列-std :: vectorに似ていますが、 realloc LinkList -チェックとパフォーマンス比較のために作成 SkipList -最終的に使用されるクラス。 将来はRed Black木も作ろうと思います。 それぞれIListに、キーでソートされた、0個以上のペアへのポインターが含まれています。 IList長くなりすぎた場合は、特殊ファイルとしてディスクに保存できます。この特殊ファイルは一種ですread only list。 キーを検索する必要がある場合は、 最初にメモリ内IListが検索されます(SkipList、SkipListまたはLinkList)。 次に、日付でソートされたファイルに検索が送信されます (最新のファイルが最初、最も古いファイル-最後)。 これらのファイルはすべてメモリにmmapされます。 何も見つからない場合、キーは見つかりません。 私はIList物事の実装に疑いはありません。 現在私を困惑させているのは以下の通りです: ペアは異なるサイズであり、それらはによって割り当てられnew()、それらをstd::shared_ptr指し示しています。 class Pair{ public: // several methods... private: struct Blob; std::shared_ptr<const Blob> _blob; }; struct Pair::Blob{ uint64_t …

2
リンクされたリストからアイテムを削除する正しい方法
このスラッシュドットのインタビューで、 Linus Torvaldsは次のように語っています。 "prev"エントリを追跡して片方向リンクリストエントリを削除し、そのエントリを削除する人が多すぎます。 if(prev) prev-> next = entry-> next; else list_head = entry-> next; そして、そのようなコードを見るときはいつでも、「この人はポインタを理解していません」とだけ行きます。悲しいことに、それはかなり一般的です。 ポインタを理解している人は、「エントリポインタへのポインタ」を使用して、list_headのアドレスで初期化します。そして、リストをトラバースするときに、「* pp = entry-> next」を実行するだけで、条件を使用せずにエントリを削除できます。 PHP開発者として、私は10年前の大学でのC入門以来ポインタに触れていません。でも、これは少なくとも知っておくべき状況だと思います。Linusは何について話しているのですか?正直なところ、リンクされたリストを実装してアイテムを削除するように求められた場合、上記の「間違った」方法は私がそれについて取り組む方法です。Linusが最もよく言うように、コーディングするために何を知る必要がありますか? 私は実際に本番コードでこれに問題を抱えていないので、スタックオーバーフローではなく、ここで質問します。
9 pointers 

4
あなたは出荷しました、あなたはまれなセグメンテーションフォールトを受け取ります。ポインタをチェックするか、それを手放しますか?
出荷され、アサートがオフになっていると、コードでnullポインタ違反が発生したことを示すまれなクラッシュレポートが表示されます。開発環境では、問題はアサートによって検出されたはずです。 あなたが持っているのはクラッシュレポートだけなので、問題を再現することはほぼ不可能です。バックトレースを追跡しても、最初にクラッシュが発生した理由についての手がかりはありません。 オプション:-クラッシュを防ぐためにポインターチェックを追加します。これはクラッシュを防ぎますが、そもそもなぜそれが起こったのかさえわからないでしょう。-飛ばして、再現シナリオで再び起こることを願って アプリケーションが誘導ミスルまたは自動ブレーキシステムを対象としていないとしましょう... どちらを選びますか?
9 bug  pointers 

6
Cでは、*は演算子ですか、それとも宣言の型の一部ですか?
Cでは*、間接演算子または間接参照演算子と呼ばれます。ステートメントで使用した場合の動作を理解しています。*por * pは、単項演算子であることを考えると、意味があります。 ただし、宣言で*は、a が使用されることがあります。 void move(int *units) { ... } または int *p = &x; ここで演算子を使用しているのは不思議です。次のようなことはできません void move(int units++) { ... } どこ++にも単項演算子です。これ*は間接演算子でも*ありますか、それともポインタの型について何かを言っている別の意味がありますか?(これが当てはまる場合、私はたとえばint* units宣言などで使用することを検討していますが、int x = *p;それ以外は明確にするためです。) で、この答えはと言われています C標準では、*演算子に対して2つの意味のみを定義しています。 間接演算子 乗算演算子 これ*は実際にはタイプの一部であると主張する人々も見ました。これは私を混乱させます。
9 c  pointers  operators 

1
タグ付きポインターの実際の使用例は何ですか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 6年前休業。 タグ付きポインターの実際の使用例は何ですか? これは主に、小さな64ビットシステムと、64ビットワードポインターの可能な使用法について読んだことが原因です。 私の理解では、タグ付きポインターは、特定のアーキテクチャーで可能なアドレス空間がはるかに小さいため、ビットで追加情報を含むことができるアドレスです。 しかし、些細な場合を超えてタグ付きポインタを使用することは可能ですか?クールなアイデア/例はありますか? タグ付きポインターを介して64ビットポインターを利用する一般的なライブラリ、フレームワークはありますか?すべてのハードウェアでそれは可能ですか?

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