2017-09-23 5 views
0

私はC/C++での初心者ですが、私はまさにこのコードで行われているもの、理解することができませんでした:事前にconst void * in((struct str_name *)p)の使用 - > str_dataitem;

const void *p; //declaration of p used above 

感謝!!

+0

初心者の方は、それを教えるレベルに達するまで忍耐強くならないのはなぜですか? –

+1

あなたはポインタについて何か知っていますか? – Pac0

+0

[const int \ *、const int \ * const、int const \ *の違いは何ですか?](https://stackoverflow.com/questions/1143262/what-is-the-difference-between) -const-int-const-int-const-int-const-int-const) –

答えて

1

ポインタはメモリ内のアドレス(場所)を格納するので、ポインタ自体に格納されたデータ(場所)はメモリのその場所に格納された実際の型に依存しません。

もしタイプvoid *のポインタを宣言する

、それは基本的にポインタは、任意のタイプ( intfloatstruct Sなど)とすることができる変数/オブジェクトのアドレスを格納することを意味します。どのタイプのデータがそこに格納されているかを知らずに、無効ポインタに格納されたデータに直接アクセスすることは意味がありません。で保存

あなたは

((struct str_name*)p)->str_dataitem; 

を使用するときは、明示的にタイプstruct str_nameのオブジェクトを保存するかのようにでメモリを扱う(そして、次の)必要がありますコンパイラpを伝え、その構造内にstr_dataitemメンバーにアクセスp

+0

void *はPythonの変数のように動作しますか?データ型と「任意の回数」に使用できることを意味します。毎回違う型で宣言できますか? @leyanpan – Sunil

+0

No. void *はポインタです(これはPythonでは存在しません)、アドレスを格納するだけです(整数iとして考えることができます。これは、データの一部がiメモリ、実際にはそうではありませんが)。それらはすべてメモリにアドレスを格納し、実際には同じものですが、コンパイル時には別の扱いをするため、他の型のポインタ(struct str_name *など)にしかキャストできません。型のp(struct str_name)にオブジェクトがすでに格納されている場合にのみ、キャストが意味を持ちます。変数の型はCで変更することはできません。 – leyanpan

+0

キャストを複数回行うことができます(毎回異なるタイプを使用します) – Sunil

関連する問題