다음 코드에서 'ptr'은 let에 의해 선언 된 구조체이지만 'pointee'멤버 변수는 변경 될 수 있습니다. 이유는 무엇입니까? 여기 let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1) ptr.pointee = 1
let이 선언 한 구조체를 왜 바꿀 수 있습니까?
4
A
답변
0
UnsafeMutablePointer
는 구조체이지만 여기
public struct UnsafeMutablePointer<Pointee> : Strideable, Hashable {
public var pointee: Pointee { get nonmutating set }
public subscript(i: Int) -> Pointee { get nonmutating set }
}
선언 "세트 nonmutating"를 속성을 설정하는 포인터 변수 자체의 상태를 돌연변이되지 않는다는 것을 의미한다.
따라서 ptr.pointee
가 새 값을 할당 할 수 있습니다 경우에도 ptr
는 상수이고, 동일한 첨자 세터 마찬가지입니다 : 포인터가 * 안전하지 않은 ** 변경 가능한로 선언 DávidPásztor @
let ptr = UnsafeMutablePointer<Int>.allocate(capacity:1)
ptr.pointee = 1
ptr[0] = 2
2
, ptr
는 일정, 그래서 당신은 해 새로운 UnsafeMutablePointer
을 할당 할 수 없습니다, 그러나 내 보유하고있는 구조를 수정할 수 있습니다. 즉, let
엔티티에 아무 것도 할당 할 수 없지만 속성에 액세스하고 수정할 수 있습니다.
1
포인터의 경우 포인터가 가리키는 메모리 주소를 변경할 수는 없지만 해당 메모리 주소에 저장된 데이터는 변경할 수 있습니다. 포인터는 메모리 주소에 대한 참조 만 저장하므로 해당 주소가 일정하면 포인터가 값을 변경하지 않습니다.
2
포인터가 구조체가 아닙니다.
값 유형 인 구조체와 달리 참조 유형입니다.
포인터를 변경할 수 있다고 선언 했으므로 pointee
(메모리 내용)을 변경할 수는 있지만 참조 자체는 변경할 수 없습니다.
** 포인터가 * – vadian
내 나쁜, 당신이 선언/가변 변경할 수없는 포인터를 자체의 유형을 의미하는 줄 알았는데. –
'struct UnsafeMutablePointer'는 구조체입니다. –