次のコードでは、 'ptr'はletによって宣言された構造体ですが、そのメンバー変数 'pointee'は変更できます。なぜですか?ここで let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1) ptr.pointee = 1
letによって宣言された構造体を変更できるのはなぜですか?
4
A
答えて
0
UnsafeMutablePointer
は構造体であるが、それは「セットをnonmutating」ここ
public struct UnsafeMutablePointer<Pointee> : Strideable, Hashable {
public var pointee: Pointee { get nonmutating set }
public subscript(i: Int) -> Pointee { get nonmutating set }
}
を宣言プロパティを設定すると、ポインタ変数自体の 状態を変異させないことを意味します。
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
ptr.pointee = 1
ptr[0] = 2
2
、ptr
は一定であるので、あなたはそれに新しいUnsafeMutablePointer
を割り当てることはできませんが、それは内の保持構造を変更することができます。要するに、let
エンティティに何かを再割り当てすることはできませんが、そのプロパティにアクセスして変更することができます。
1
ポインターの場合は、指しているメモリーアドレスを変更することはできませんが、そのメモリーアドレスに保管されているデータを変更することはできます。 ポインタはメモリアドレスへの参照を格納するだけなので、そのアドレスが一定である限り、Pointerはその値を変更しませんでした。
2
ポインタは構造体ではありません。
値型の構造体とは異なり、参照型です。
ポインタを変更可能と宣言しているので、pointee
(メモリの内容)は変更できますが、参照自体は変更できません。
関連する問題
- 1. はなぜ構造体を作成した構造体宣言
- 2. 変わった構造体宣言
- 3. 宣言構造体
- 4. .NETで戻り値の型が構造体として宣言されているのはなぜですか?
- 5. 別の構造体内で構造体を宣言し、プライベートとして宣言されたときに問題にアクセスする
- 6. ポインタを構造体として宣言できますか?
- 7. PythonからC-宣言されたネストされた構造体にアクセスする
- 8. Swift - 私的なネストされた構造体を宣言するには?
- 9. 構造体フィールドがメインで宣言されていません
- 10. 構造体の親変数を宣言からどのように変更するのですか?
- 11. インライン構造体宣言
- 12. 構造体宣言のセミコロンがグローバル変数の前に構造体変数が宣言されていますか?
- 13. 私の構造体をポインタとして宣言しなければならないのはなぜですか?
- 14. 関数スコープで定義された構造体を宣言する方法は?
- 15. [C]:構造体へのポインタへのポインタが関数に渡されたとき、なぜ構造体の要素を変更できないのですか?
- 16. 構造体をC言語で宣言せずに宣言する
- 17. Go Relflect構造体を宣言する
- 18. 他のパッケージから宣言された構造体に値を代入する
- 19. なぜ構造体のベクトルメンバーを宣言して初期化できないのですか?
- 20. 構造体ポインタ関数の宣言されていない変数c
- 21. Golang:私は構造体のマップを持っています。構造体値のフィールドを直接変更できないのはなぜですか?
- 22. C:宣言後に構造体変数を初期化する
- 23. forwardクラスの前に構造体として宣言されている型を宣言する
- 24. 宣言されていない構造体によって警告が発生しない
- 25. クラス、構造体、またはインターフェイスメンバ宣言の無効なトークン 'String'
- 26. 無効なトークン ';'クラス構造体またはインターフェイスのメンバ宣言
- 27. C# - クラス構造体またはインターフェイスメンバー宣言の無効なトークン ''
- 28. 構造体へのグローバルポインタの宣言
- 29. Cの構造体宣言の配列
- 30. Cの構造体の前方宣言?
DávidPá[email protected]ポインタが**危険**変更可能な*として宣言されていますので
ptr.pointee
はptr
が一定で、かつ同じ添字セッターのための真である場合でも、新しい値を割り当てることができますポインタ* – vadian
私の悪い、私はあなたが可変/不変、ポインタ自体の型ではない宣言を意味すると思った。 –
'struct UnsafeMutablePointer'は構造体です。 –