게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
포인터를 사용한 swap
게시물ID : programmer_5238짧은주소 복사하기
작성자 : 황금비
추천 : 0
조회수 : 929회
댓글수 : 16개
등록시간 : 2014/09/01 10:23:54
앞서 제가 글을 올렸는데 정리를 더 해서 오해를 만들 지 말았어야 했는데 .. 뭐 제가 표현력이 없어서 그렇다고 생각하시면 될 것 같습니다.
좀 더 좋은 내용으로 가는게 제 목적이구요, 이번엔 좀 더 깔끔한 코드 준비했습니다.

대상은 swap 함수. 포인터 예제로 간단하면서 실용성이 높은 함수입니다. 또 제가 자주 사용하는 함수이기도 합니다.

class User {
private:
int id;

public:
int hp;

User() : id(0), hp(0){};

void SetId(int v) { id = v;}
int  GetId()      { return id; }
};

void Swap (void* _a, void* _b, int width) {
char* a =(char*)_a;
char* b =(char*)_b;
char tmp;

if(a == b)
return;

while (width--) {
tmp = *a;
*a++ = *b;
*b++ = tmp;
}
}

//...

int main() {

User a;
User b;

a.SetId(100);
b.SetId(100000000);

Swap(&a, &b, sizeof(User));
printf(" a.id = %d\n", a.GetId());

return 0;
}

데이터 타입에 관계 없이 모든 데이터에 대해서 swap이 될 수 있도록 void형 포인터로 인수 값을 받습니다.
void 포인터는 주소만 받기 때문에 이를 byte 단위로 복사하기 위해서 char형 포인터로 캐스팅 했습니다.

User 클래스는 private를 가지고 있으나 swap 함수에서는 그런거 필요 없게 됩니다.
a 객체의 id를 100으로 설정하고 b의 객체의 아이디를 100000000 설정해서  Swap 함수로 돌리면 둘은 바뀌었음을 볼 수 있습니다.

이 함수는 멤버의 접근 권한이나 뭐 그런 거 없이 그리고 객체의 타입에 상관 없이 swap시켜준다는 것입니다.


전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호