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

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

5
* ptr + = 1とCの* ptr ++の違い
Cの勉強を始めたばかりで、関数のパラメーターとしてポインターへのポインターを渡すことについて1つの例を実行すると、問題が見つかりました。 これは私のサンプルコードです: #include <stdio.h> #include <string.h> #include <stdlib.h> int* allocateIntArray(int* ptr, int size){ if (ptr != NULL){ for (int i = 0; i < size; i++){ ptr[i] = i; } } return ptr; } void increasePointer(int** ptr){ if (ptr != NULL){ *ptr += 1; /* <----------------------------- This is line 16 …

11
リンクされたリストがノード内にノードを格納する代わりにポインタを使用する理由
私はJavaで広範囲に及ぶ前にリンクリストを扱ってきましたが、C ++は非常に初めてです。私はプロジェクトで与えられたこのノードクラスをうまく使っていました class Node { public: Node(int data); int m_data; Node *m_next; }; しかし、私はあまりよく答えられなかった一つの質問をしました。なぜ使用する必要があるのですか Node *m_next; リストの次のノードを指すのではなく Node m_next; ポインタバージョンを使用する方がよいことを理解しています。事実について議論するつもりはありませんが、なぜそれが優れているのかはわかりません。私は、ポインターがメモリ割り当てにどのように優れているかについて明確な答えが得られなかったので、ここにいる誰かがそれをよりよく理解するのに役立つかどうか疑問に思っていました。

21
nullポインタにアドレス0が使用されるのはなぜですか?
C(またはそのことについてはC ++)では、値がゼロの場合、ポインターは特別です。メモリーを解放した後、ポインターをゼロに設定することをお勧めします。mallocを呼び出すと、メモリを取得できない場合は値0のポインタが返されます。私はif (p != 0)常に、渡されたポインタが有効であることなどを確認するために使用しています。 しかし、メモリアドレス指定は0から始まるので、0は他のアドレスと同じように有効なアドレスではありませんか?その場合、nullポインターの処理に0をどのように使用できますか?代わりに負の数がnullにならないのはなぜですか? 編集: 良い答えがたくさん。私の心がそれを解釈しているように表現された答えで言われたことを要約し、私が誤解した場合、コミュニティが私を修正してくれることを願っています。 プログラミングの他のすべてのように、それは抽象化です。単なる定数であり、実際にはアドレス0に関連していません。C++ 0xは、キーワードを追加することでこれを強調していnullptrます。 これはアドレスの抽象化でもありません。C標準で指定されている定数であり、コンパイラが「実際の」アドレスと決して等しくないことを確認する限り、他の数値に変換できます。0がプラットフォームに使用するのに最適な値。 初期の場合のように抽象化されていない場合、アドレス0はシステムによって使用され、プログラマーの立ち入りを制限します。 私の負の数の提案は少しワイルドなブレーンストーミングだったと私は認めます。アドレスに符号付き整数を使用することは、ヌルポインター(-1など)を除いて、値空間が有効なアドレスを作る正の整数と無駄になる負の数に均等に分割されることを意味する場合、少し無駄です。 いずれかの数値が常にデータ型で表現できる場合、それは0です(おそらく1もそうです。符号なしの場合は0または1になる1ビット整数、または符号付きの場合は単に符号付きビット、または[-2、1]になります。ただし、0がnullで、1がメモリ内の唯一のアクセス可能なバイトであることを確認できます。) それでも未だに未解決な部分があります。スタックオーバーフローの質問特定の固定アドレスへのポインターは、nullポインターの0が抽象化であっても、他のポインター値は必ずしもそうではないことを示しています。これにより、別のスタックオーバーフローの質問を投稿するようになりました。アドレス0にアクセスできますか?。
121 c++  c  memory  pointers 


10
2次元配列へのポインターを作成する
静的な2次元配列へのポインターが必要です。これはどのように行われますか? static uint8_t l_matrix[10][20]; void test(){ uint8_t **matrix_ptr = l_matrix; //wrong idea } 次のようなさまざまなエラーが発生します。 警告:互換性のないポインタ型からの割り当て 下付きの値は配列でもポインタでもありません エラー:フレキシブル配列メンバーの無効な使用
119 c  arrays  pointers 

9
Cポインター:固定サイズの配列を指す
この質問は、そこにいるCの教祖に向けられます。 Cでは、次のようにポインターを宣言することができます。 char (* p)[10]; ..これは基本的に、このポインターが10文字の配列を指すことを示しています。このようにポインターを宣言することの優れた点は、異なるサイズの配列のポインターをpに割り当てようとすると、コンパイル時エラーが発生することです。単純なcharポインタの値をpに割り当てようとすると、コンパイル時エラーも発生します。これをgccで試しましたが、ANSI、C89、およびC99で動作するようです。 このようにポインタを宣言することは、特にポインタを関数に渡す場合に非常に便利です。通常、このような関数のプロトタイプは次のように記述します。 void foo(char * p, int plen); 特定のサイズのバッファが必要な場合は、単純にplenの値をテストします。ただし、pを渡した人が実際にそのバッファ内の有効なメモリ位置をplenに与えることは保証できません。この関数を呼び出した人が正しいことをしていることを信頼する必要があります。一方: void foo(char (*p)[10]); ..呼び出し側に指定されたサイズのバッファを強制的に与えます。 これは非常に便利なようですが、これまでに出くわしたコードでこのように宣言されたポインターを見たことはありません。 私の質問は次のとおりです。人々がこのようなポインタを宣言しない理由はありますか?明らかな落とし穴は見られませんか?
119 c  pointers  size 




10
ptrがNULLであるfree(ptr)はメモリを破壊しますか?
理論的には free(ptr); free(ptr); すでに解放されているメモリを解放しているため、メモリ破損です。 しかし、もし free(ptr); ptr=NULL; free(ptr); OSは未定義の方法で動作するので、何が起こっているのかについてこれに関する実際の理論的分析を得ることができません。私が何をしていても、このメモリ破損はありますか? NULLポインタの解放は有効ですか?

3
このコードが64ビットアーキテクチャでsegfaultになるのに、32ビットでは正常に機能するのはなぜですか?
次のCパズルを見つけました。 Q:IA-64では次のプログラムがsegfaultするのに、IA-32では正常に動作するのはなぜですか? int main() { int* p; p = (int*)malloc(sizeof(int)); *p = 10; return 0; } int64ビットマシンののサイズは、ポインタのサイズと同じではない可能性があることを知っています(int32ビットであり、ポインタは64ビットである可能性があります)。しかし、これが上記のプログラムとどのように関連しているかはわかりません。何か案は?

6
ポインタのこの使用法を予測不可能にするのは何ですか?
私は現在ポインタを学んでおり、私の教授は例としてこのコードを提供しました: //We cannot predict the behavior of this program! #include <iostream> using namespace std; int main() { char * s = "My String"; char s2[] = {'a', 'b', 'c', '\0'}; cout << s2 << endl; return 0; } 彼はコメントで、プログラムの動作を予測することはできないと書いています。正確には何が予測不可能になるのでしょうか?私はそれで何も悪いことを見ません。
108 c++  pointers 

2
値レシーバーとポインターレシーバー
常にポインターレシーバーを使用するのではなく、値レシーバーを使用したい場合は、私には非常に不明確です。 ドキュメントから要約するには: type T struct { a int } func (tv T) Mv(a int) int { return 0 } // value receiver func (tp *T) Mp(f float32) float32 { return 1 } // pointer receiver ドキュメントは、「そのような基本的なタイプ、スライス、および小さな構造体などの種類については、値の受信機が非常に安くなっメソッドのセマンティクスは、ポインタを必要としない限り、値の受信機は、効率的かつ明確である。」また言います 最初のポイントは、それが「非常に安い」と述べていますが、問題は、ポインターレシーバーよりも安いということです。そこで、小さなベンチマーク(コードの要旨)を作成しました。これは、文字列フィールドが1つしかない構造体の場合でも、ポインターレシーバーの方が高速であることを示しています。これらは結果です: // Struct one empty string property BenchmarkChangePointerReceiver 2000000000 0.36 ns/op BenchmarkChangeItValueReceiver 500000000 3.62 …
107 function  pointers  go 

2
Goでリテラル* int64を実行するにはどうすればよいですか?
*int64フィールドを持つ構造体型があります。 type SomeType struct { SomeField *int64 } 私のコードのある時点で、これのリテラルを宣言したいと思います(たとえば、値が0でなければならないことがわかっている場合、または0を指している場合、私が何を意味するのかを知っています) instance := SomeType{ SomeField: &0, } ...これが機能しないことを除いて ./main.go:xx: cannot use &0 (type *int) as type *int64 in field value だから私はこれを試します instance := SomeType{ SomeField: &int64(0), } ...しかし、これも機能しません ./main.go:xx: cannot take the address of int64(0) どうすればよいですか?私が思いつくことができる唯一の解決策は、プレースホルダー変数を使用することです var placeholder int64 placeholder = 0 …
103 pointers  go  struct  literals 

2
「バイト数」をゼロに設定してmemcpy()およびmemmove()を呼び出すことはできますか?
私はactully移動することは何もないとき/治療の例に必要でコピーしていますmemmove()/ memcpy()エッジケースなど int numberOfBytes = ... if( numberOfBytes != 0 ) { memmove( dest, source, numberOfBytes ); } または私はチェックせずに関数を呼び出す必要があります int numberOfBytes = ... memmove( dest, source, numberOfBytes ); 前のスニペットのチェックは必要ですか?
102 c++  c  pointers  memcpy  memmove 

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