let mut v = vec![1, 2, 3, 4, 5];
이렇게 벡터가 있을 때
&v[0]이랑 v[0]이랑 똑같이 1 나오던데
&v[0]은 포인터 값 나와야하는거 아님?
그리고 &v[0] = 99;
이 코드는 왜 컴파일 에러남?
let mut v = vec![1, 2, 3, 4, 5];
이렇게 벡터가 있을 때
&v[0]이랑 v[0]이랑 똑같이 1 나오던데
&v[0]은 포인터 값 나와야하는거 아님?
그리고 &v[0] = 99;
이 코드는 왜 컴파일 에러남?
러스트에서는 &가 포인터 연산자가 아니라 레퍼런스 연산자임 두번째 거는 &v[0]에서 mut을 안 줘서 그럼
vector에 mut을 줬는데 &v[0]에 mut을 또 어떻게 줘야되는거임??
&mut v[0] 이렇게 해야됨
*&mut v[0] = 3; 하면 아마 될건데
해보니까 되는데 이해가 좀 안됨 &mut v[0]이 의미하는게 주소값 맞음??
윗댓 말대로 &는 주소 가져오는 연산자가 아님
그럼 &mut v[0]이 도대체 뭐길래 * 를 붙이면 되는거임??
&는 불변참조 가져오는거고 가변참조는 &mut 임 - dc App
그러네 근데 위 댓글에서 좀 이해가 안가는게 레퍼런스 연산자도 결국 참조인데 참조랑 포인터랑 다름? 가변 참조해서 갖고오는게 결국 포인터를 갖고오는거 아닌가?
포인터 연산은 unsafe라서 주소 가져오는거 따로 있음 가져오는건 safe고 값읽으려하면 unsafe였던가 그럴껀데 기본적으로 참조는 타입세이프한데 포인터연산은 아니잖아 그래서 구분하는게 맞는 듯 - dc App
해당 댓글은 삭제되었습니다.
레퍼런스 포인터로 바꾸는건 그냥 as 써서 변환하면 된다 x가 i32면 unsafe도 없이 &mut x as *mut i32 이렇게 쓰면 된다
transmute는 사이즈만 같으면 어떤 타입을 넣든지 다 되는거라서 isize를 *mut i32로 바꾸는 것도 되고 &char를 *mut i32로 바꾸는것도 된다
as은 타입을 체크하니까 안전한데 transmute는 사이즈만 체크하니까 레퍼런스를 포인터로 바꿀때는 transmute를 쓰지 말란 얘기임 as를 써서 *mut를 &mut로 바꾸는건 unsafe지만 어쨌든 타입이 달라지면 에러남 Deref 같은거 구현되어 있는데 transmute를 쓰면 더 복잡해지고
그런 용도로는 transmute가 의미없다 transmute로 64비트 컴퓨터에서 레퍼런스를 [char; 2]로 바꿀수있는데 그렇다고 레퍼런스가 사이즈2짜리 char배열이랑 메모리크기 제외하고 같은게 없잖아
저게 C에서도 되나? 안 될텐데? int a[ 10 ]; &a[ 0 ] = 99;가 된다고?
그리고 &a[ 0 ]가 출력이 되는 건 Fmt 트레잇의 fmt함수가 &self를 받기 때문임.