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

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

29
ポインターの有効性のテスト(C / C ++)
与えられたポインタが「有効」かどうかを(プログラム的にはもちろん)判断する方法はありますか?NULLのチェックは簡単ですが、0x00001234のようなものはどうですか?この種類のポインタを逆参照しようとすると、例外/クラッシュが発生します。 クロスプラットフォームの方法が推奨されますが、プラットフォーム固有(WindowsおよびLinuxの場合)でも問題ありません。 明確化のための更新: 問題は、古くなった、解放された、初期化されていないポインターには関係ありません。代わりに、呼び出し元からポインターを取得するAPI(文字列へのポインター、ファイルハンドルなど)を実装しています。呼び出し元は、ポインタとして(意図的または誤って)無効な値を送信できます。クラッシュを防ぐにはどうすればよいですか?
90 c++  c  validation  pointers  null 

4
int(*)(int *)= 5(または任意の整数値)の意味
私はこれを理解することはできません: int main() { int (*) (int *) = 5; return 0; } 上記の割り当ては、g ++ c ++ 11でコンパイルされます。それint (*) (int *)が(int *)引数として受け入れてintを返す関数へのポインタであることは知っていますが、それを5と同等にする方法がわかりません。最初は、常に5を返す関数だと思いました(最近の学習からF#、おそらくハハ)、それから私は簡単に、関数ポインタがメモリ位置5を指していると思いましたが、それは明らかに機能せず、16進値も機能しません。 関数がintを返すためである可能性があり、intの割り当ては(どういうわけか)大丈夫だと考えて、私もこれを試しました: int * (*) (int *) = my_ptr ここmy_ptrで、は型int *であり、int型の最初の場合と同様に、この2番目の関数ポインタと同じ型です。これはコンパイルされません。の代わりに5または任意のint値を割り当ててもmy_ptr、この関数ポインターに対してはコンパイルされません。 では、割り当てはどういう意味ですか? アップデート1 ベストアンサーに示されているように、これはバグであることが確認されています。ただし、関数ポインタに割り当てた値に実際に何が起こるのか、または割り当てで何が起こるのかはまだわかりません。それについての(良い)説明は大歓迎です!問題をより明確にするために、以下の編集を参照してください。 編集1 gccバージョン4.8.2(Ubuntu 4.8.2)を使用しています 編集2 実際、それを何かと同等にすることは私のコンパイラで機能します。std :: string変数、またはdoubleを返す関数名と同等でも機能します。 2.1を編集 興味深いことに、ポインタではないデータ型を返す関数への関数ポインタにすると、次のようにコンパイルできます。 std::string (*) () = 5.6; しかし、関数ポインタが何らかのポインタを返す関数を指すとすぐに、次のようにコンパイルされません。 …


5
「int * ptr = int()」値の初期化はどのように違法ではありませんか?
次のコード(ここから取得): int* ptr = int(); Visual C ++でコンパイルし、ポインタを値初期化します。 そんなことがあるものか?I平均int()利回り型のオブジェクトintと私は割り当てることができませんintポインタに。 上記のコードはどのように違法ではありませんか?

10
C#リファレンスとポインターの違いは何ですか?
C#参照とポインターの違いがよくわかりません。どちらも記憶の中の場所を指していますね。私が理解できる唯一の違いは、ポインターはそれほど賢くなく、ヒープ上の何も指すことができず、ガベージコレクションが免除され、構造体または基本型のみを参照できることです。 私が尋ねる理由の1つは、優れたプログラマーになるには、人々がポインターをよく理解する必要があるという認識があることです(Cからだと思います)。高水準言語を学ぶ多くの人々はこれを見逃しているため、この弱点を持っています。 ポインタについてそれほど複雑なものがわかりませんか?それは基本的には記憶の中の場所への単なる参照ですよね?その場所を返し、その場所のオブジェクトと直接対話できますか? 私は大きなポイントを逃したことがありますか?
86 c#  pointers  reference 

3
C ++ 17以降、正しいアドレスとタイプのポインターは常に有効なポインターですか?
(この質問と回答を参照してください。) C ++ 17標準の前は、次の文が[basic.compound] / 3に含まれていました。 タイプTのオブジェクトがアドレスAにある場合、値がアドレスAであるタイプcv T *のポインターは、値の取得方法に関係なく、そのオブジェクトを指していると言われます。 しかし、C ++ 17以降、この文は削除されました。 たとえば、この文によってこのサンプルコードが定義され、C ++ 17以降は未定義の動作であると思います。 alignas(int) unsigned char buffer[2*sizeof(int)]; auto p1=new(buffer) int{}; auto p2=new(p1+1) int{}; *(p1+1)=10; C ++ 17より前p1+1は、へのアドレスを保持し*p2、正しい型を持っているので*(p1+1)、へのポインタもそうです*p2。C ++で17p1+1ある過去エンドポインタになっていないので、オブジェクトへのポインタと、私はそれがdereferencableではないと信じています。 この標準的な権利の変更の解釈ですか、それとも引用された文の削除を補償する他の規則がありますか?

5
Go HTTPハンドラーで、ResponseWriterが値であるのに、Requestがポインターであるのはなぜですか?
私はGAE用のアプリを書くことでGoを学んでいます。これは、ハンドラー関数のシグネチャです。 func handle(w http.ResponseWriter, r *http.Request) {} 私はここではポインタ初心者ですが、なぜRequestオブジェクトはポインタなのResponseWriterですか?このようにする必要はありますか、それともある種の高度なポインタベースのコードを可能にするためだけですか?
84 pointers  go 

9
Python変数はポインタですか?それとも彼らは何ですか?
私の知る限り、Pythonの変数は単なるポインターです。 このルールに基づいて、このコードスニペットの結果は次のようになります。 i = 5 j = i j = 3 print(i) になります3。しかし、私は予想外の結果を得ました、それはでした5。 さらに、私のPythonの本はこの例をカバーしています: i = [1,2,3] j = i i[0] = 5 print(j) 結果はになります[5,2,3]。 私は何を間違って理解していますか?

5
「int * nums = {5、2、1、4}」はセグメンテーション違反を引き起こします
int *nums = {5, 2, 1, 4}; printf("%d\n", nums[0]); セグメンテーション違反を引き起こしますが、 int nums[] = {5, 2, 1, 4}; printf("%d\n", nums[0]); そうではありません。今: int *nums = {5, 2, 1, 4}; printf("%d\n", nums); 5を印刷します。 これに基づいて、配列初期化表記{}は、このデータを左側の変数に盲目的にロードすると推測しました。int []の場合、配列は必要に応じていっぱいになります。int *の場合、ポインタは5でいっぱいになり、ポインタが格納された後のメモリ位置は2、1、4でいっぱいになります。したがって、nums [0]は5をデリファレンスしようとし、セグメンテーション違反を引き起こします。 私が間違っている場合は、私を訂正してください。そして、私が正しければ、配列初期化子がなぜそのように機能するのか理解できないので、詳しく説明してください。
81 c  arrays  pointers 

6
const char *とcharconst *-それらは同じですか?
私の理解では、const修飾子は右から左に読む必要があります。それから、私はそれを得る: const char* char要素を変更できないポインタですが、ポインタ自体は変更できます。 char const* mutablecharsへの定数ポインタです。 しかし、次のコードで次のエラーが発生します。 const char* x = new char[20]; x = new char[30]; //this works, as expected x[0] = 'a'; //gives an error as expected char const* y = new char[20]; y = new char[20]; //this works, although the pointer should be const (right?) y[0] …

3
Boostassert.hppファイルでP :: ************はどういう意味ですか?
でブースト/ MPL / assert.hpp、私はこのようなものを見ました: template<class Pred> struct eval_assert { typedef typename extract_assert_pred<Pred>::type P; typedef typename P::type p_type; typedef typename ::boost::mpl::if_c<p_type::value, AUX778076_ASSERT_ARG(assert<false>), failed ************ P::************ >::type type; }; 最初のもの************を構造体のポインタが失敗したものとして扱うことができる場合、P::************私には本当に意味がありません。これは標準のC ++ですか?
80 c++  pointers  boost 


7
値0の代わりにNULLを使用できますか?
NULLの値の代わりにポインタを使用でき0ますか? それとも、そのことについて何か問題がありますか? たとえば、 int i = NULL; の代わりとして: int i = 0; 実験として、次のコードをコンパイルしました。 #include <stdio.h> int main(void) { int i = NULL; printf("%d",i); return 0; } 出力: 0 確かにそれは私にこの警告を与えます、それ自体は完全に正しいです: warning: initialization makes integer from pointer without a cast [-Wint-conversion] しかし、結果は同じです。 これで「未定義の動作」にぶつかりますか? NULLこのように利用することは許されますか? NULL算術式の数値として使用することに問題はありますか? そして、この場合のC ++の結果と動作は何ですか? 私はの答え読み持っている「\ 0」、NULLの違いは何をして0との違いは何かについてNULL、\0そして0それが正しい使用にも非常に許容され、場合、ですが、私はそこからの簡潔な情報を取得していないNULLとして、代入やその他の算術演算で操作する値。

4
((void(*)())buf)();とは 平均?
私はpicoCTFでのバイナリの悪用の課題を解決しており、次のコードに遭遇しました。 ((void (*)())buf)(); どこbufの文字列です。 私は問題を解決しましたが、それが何をしているのか正確に理解できないようです。私はこのスレッドを見ましたが、理解できませんでした。 どういう((void (*)())buf)();意味ですか?

6
なぜこれはタイプパンニングされたポインターの警告を逆参照しているとコンパイラ固有に主張されているのですか?
Stack Overflow REのさまざまな 投稿 を 読みました:逆参照型でパンされたポインターエラーです。私の理解では、エラーは本質的に、異なる型のポインターを介してオブジェクトにアクセスする危険性についてのコンパイラー警告である(例外はに対して行われているように見えます)と理解でき、これは理解できる合理的な警告です。char* 私の質問は以下のコードに固有です:なぜポインターのアドレスvoid**をこの警告の修飾にキャストするの-Werrorですか(を介してエラーにプロモートされます)? さらに、このコードは複数のターゲットアーキテクチャ用にコンパイルされており、そのうちの1つだけが警告/エラーを生成します。これは、正当にコンパイラのバージョン固有の欠陥であることを意味しているのでしょうか? // main.c #include <stdlib.h> typedef struct Foo { int i; } Foo; void freeFunc( void** obj ) { if ( obj && * obj ) { free( *obj ); *obj = NULL; } } int main( int argc, char* argv[] ) { …
38 c  pointers  casting 

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