문제
2D 캐릭터 배열이 있습니다.
char nm[MAX1][MAX2] = { "john", "bob", "david" };
이 두 가지 요소를 교체하고 싶습니다 ( std::swap
) 단순히 글을 쓰면
swapPointers(nm[0], nm[1]);
어디 swapPointers
이렇게 보인다
void swapPointers(char *&a, char *&b)
{
char *temp = a;
a = b;
b = a;
}
그러나 이것은 컴파일하지 않습니다 (그리고 캐스트를 추가하면 컴파일이되면 포인터는 잘못/이상한 위치를 가리키게됩니다).
아무도 도울 수 있습니까?
감사!
해결책
Zan은 가깝지만 그의 문제는 그의 '스왑'기능이 캐릭터에 대한 포인터를 취할 수 있다는 것입니다. 오용하면 문제가 발생할 수 있습니다. 다음은 더 안전한 버전입니다.
void swap(char (&x)[MAX2], char (&y)[MAX2])
{
char temp[MAX2];
memcpy(temp, x, MAX2);
memcpy(x, y, MAX2);
memcpy(y, temp, MAX2);
}
포스터의 일부에는 오해가 있습니다. 'nm'은 2 차원의 캐릭터 배열입니다. 포인터가 없습니다. NM [0], NM [2] 등은 포인터도 아닙니다. 여전히 (1 차원) 어레이입니다. 1 차원 어레이가 포인터로 암시 적으로 변환 가능하다는 사실은 많은 C 및 C ++ 프로그래머들 사이에서 이러한 유형의 혼란을 유발합니다.
2 차원 배열에서 데이터를 교체하려면 '스왑'함수 Zan과 내가 쓴 두 가지 크기 Max2의 메모리 블록을 교체해야합니다.
다른 팁
포인터가 2 차원 배열을 가리키기 때문에 포인터를 재 할당하여 포인터를 교환 할 수 없습니다.
nm [a]와 nm [b]는 매우 강력합니다. const
NM은 진정이기 때문입니다 const
물체. 그렇지 않은 경우 이름을 재 할당하여 C 변수를 RAM으로 이동할 수 있습니다.
혼란을 생각하십시오! 그래서 당신은 그렇게 할 수 없습니다. :-)
포인터가 가리키는 것을 교환하려면 해당 배열 위치의 값을 교체해야합니다.
swap(char *a, char *b)
{
char temp[MAX1];
memcpy(temp, a, MAX1);
memcpy(b, a, MAX1);
memcpy(a, temp, MAX1);
}
당신의 swapPointers()
배열을 통과하려고하는 반면 포인터를 교환합니다.
당신이 변하면
char nm[MAX1][MAX2]
에게
char *nm[MAX1]
작은 버그를 고정하십시오 swapPointers()
(마지막 줄이 있어야합니다 b = temp;
), 효과가있다.
실제 요점은 C ++를 사용하는 경우 std :: std :: string의 std :: 벡터를 사용해야한다는 것입니다.
std::vector<std::string> nm;
nm.push_back( "john" );
nm.push_back( "bob" );
nm.push_back( "david" );
std::swap( nm[0], nm[1] );
참고 : 테스트되지 않았습니다.
void swapPointers(char** ppa, char** ppb)
{
char* ptemp = *ppa;
*ppb = *ppa;
*ppa = ptemp;
}
swapPointers(&nm[0], &nm[1]);