문제

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]);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top