programing

C(char, int)에서 포인터 교환

minimums 2023. 6. 7. 22:25
반응형

C(char, int)에서 포인터 교환

저는 C에서 포인터를 교환할 때의 다른 행동을 이해하기 위해 노력해 왔습니다.두 개를 요.int는 인터포, 그면할수있다니습러포▁do를 할 수 있습니다.

void intSwap (int *pa, int *pb){
    int temp = *pa;
    *pa = *pb;
    *pb = temp;
}

하지만, 만약 내가 두 개를 교환하고 싶다면,char제가 해야 할 조언들은 다음과 같습니다.

void charSwap(char** a, char** b){
    char *temp = *a;
    *a = *b;
    *b = temp;
}

내가 한다면,

void charSwap(char* a, char* b){
    char temp = *a;
    *a = *b;
    *b = temp;
}

컴파일러는 값을 변경할 수 없기 때문에 *a = *b라는 표현에 대해 불평합니다.두 개를 요.strings (계속,char* s1= "Hello"; char* s2="Bye";어떻게 하겠습니까?

저를 조금만 도와주실 수 있나요?정답을 얻을 때까지 항상 시행착오를 겪지 않아도 되도록 어떻게 작동하는지 정말 배우고 싶습니다.저는 그것이 다른 많은 사람들에게 유용하기를 바랍니다.

여러분이 이해해야 할 첫 번째 것은 어떤 것을 어떤 함수에 전달할 때, 어떤 것이 그 함수의 인수에 복사된다는 것입니다.

다음이 있다고 가정합니다.

void swap1(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    assert(a == 17);
    assert(b == 42);
    // they're swapped!
}

int x = 42;
int y = 17;
swap1(x, y);
assert(x == 42);
assert(y == 17);
// no, they're not swapped!

원래 변수의 값이 함수의 인수로 복사되므로 원래 변수는 스왑되지 않습니다.그런 다음 함수는 해당 인수의 값을 교환하고 반환합니다.함수는 자신의 개인 복사본만 교환하므로 원래 값은 변경되지 않습니다.

이제 이 문제를 어떻게 해결해야 할까요?함수에는 원래 변수를 참조하는 방법이 필요하며 값의 복사본이 필요하지 않습니다.C에서 다른 변수를 어떻게 참조할 수 있습니까?포인터를 사용합니다.

변수에 대한 포인터를 함수에 전달하면 함수는 자체 인수 복사본 대신 변수의 값을 스왑할 수 있습니다.

void swap2(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
    assert(*a == 17);
    assert(*b == 42);
    // they're swapped!
}

int x = 42;
int y = 17;
swap2(&x, &y); // give the function pointers to our variables
assert(x == 17);
assert(y == 42);
// yes, they're swapped!

함수 내부에서 포인터에 할당하는 것이 아니라 포인터가 가리키는 것에 할당하는 것에 주목합니다.는 우리의 인 그고포는우변리가수리다니킵을들의터인을 가리킵니다.x그리고.y함수는 우리가 제공하는 포인터를 통해 변수에 저장된 값을 직접 변경합니다.그리고 그것이 바로 우리가 필요로 했던 것입니다.

이제 두 개의 포인터 변수가 있고 포인터 자체를 스왑하려면 어떻게 됩니까? (그들이 가리키는 값과 반대로)?포인터를 전달하면 포인터가 단순히 인수에 복사됩니다(그들이 가리키는 값이 아님).

void swap3(int* a, int* b) {
    int* temp = a;
    a = b;
    b = temp;
    assert(*a == 17);
    assert(*b == 42);
    // they're swapped!
}
void swap4(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
    assert(*a == 17);
    assert(*b == 42);
    // they're swapped!
}

int x = 42;
int y = 17;
int* xp = &x;
int* yp = &y;
swap3(xp, yp);
assert(xp == &x);
assert(yp == &y);
assert(x == 42);
assert(y == 17);
// Didn't swap anything!
swap4(xp, yp);
assert(xp == &x);
assert(yp == &y);
assert(x == 17);
assert(y == 42);
// Swapped the stored values instead!

swap3인수에서 얻은 포인터의 개인 복사본만 교환합니다.그것은 우리가 가지고 있던 것과 같은 문제입니다.swap1.그리고.swap4포인터가 아니라 변수가 가리키는 값을 변경하는 것입니다!함수에 변수를 참조할 수 있는 수단을 제공합니다.x그리고.y하지만 우리는 그들이 참조하기를 원합니다.xp그리고.yp.

우리가 저걸 어떻게 해요?우리는 그들의 주소를 전달합니다!

void swap5(int** a, int** b) {
    int* temp = *a;
    *a = *b;
    *b = temp;
    assert(**a == 17);
    assert(**b == 42);
    // they're swapped!
}


int x = 42;
int y = 17;
int* xp = &x;
int* yp = &y;
swap5(&xp, &yp);
assert(xp == &y);
assert(yp == &x);
assert(x == 42);
assert(y == 17);
// swapped only the pointers variables

변수가 .xp을 가리키고 있습니다y하지만 그들이 가리키는 값은 아닙니다.포인터 변수를 참조할 수 있는 방법을 제공하여 변수를 변경할 수 있습니다!

지금쯤은 두 개의 문자열을 다음과 같은 형태로 교환하는 방법을 이해하기 쉬울 것입니다.char*변수스왑 기능은 다음에 대한 포인터를 수신해야 합니다.char*.

void swapStrings(char** a, char** b){
    char *temp = *a;
    *a = *b;
    *b = temp;
    assert(strcmp(*a, "world") == 0);
    assert(strcmp(*b, "Hello") == 0);
}

char* x = "Hello";
char* y = "world";
swapStrings(&x, &y);
assert(strcmp(x, "world") == 0);
assert(strcmp(y, "Hello") == 0);
void intSwap (int *pa, int *pb){
    int temp = *pa;
    *pa = *pb;
    *pb = temp;
}

다음 사항을 알아야 합니다.

int a = 5; // an integer, contains value
int *p; // an integer pointer, contains address
p = &a; // &a means address of a
a = *p; // *p means value stored in that address, here 5

void charSwap(char* a, char* b){
    char temp = *a;
    *a = *b;
    *b = temp;
}

그래서 이렇게 바꿀 때.값만 스왑됩니다.그래서 당분간은char*단지 그들의 첫번째.char스왑합니다.

이제 char*(문자열)을 명확하게 이해했다면 포인터만 교환하면 된다는 것을 알아야 합니다.당신이 그것을 생각한다면 이해하기 쉬울 것입니다.array끈 대신에

void stringSwap(char** a, char** b){
    char *temp = *a;
    *a = *b;
    *b = temp;
}

그래서, 여기서 당신은 이중 포인터를 건네고 있습니다. 왜냐하면 시작하기 때문입니다.array그 자체가 포인터입니다.

C에서 문자열은 아시다시피 문자 포인터(문자 *)입니다.두 개의 문자열을 스왑하려면 두 개의 문자 포인터, 즉 두 개의 주소만 스왑합니다.함수에서 스왑을 수행하려면 스왑할 두 항목의 주소를 지정해야 합니다.그래서 두 개의 포인터를 교환하는 경우에는 포인터가 필요합니다.int를 교환하는 것과 마찬가지로 int에 대한 포인터만 있으면 됩니다.

마지막 코드 스니펫이 작동하지 않는 이유는 두 개의 문자 포인터를 스왑할 것으로 예상하기 때문입니다. 실제로 두 개의 문자를 스왑하기 위해 작성되었습니다.

편집: 위의 예에서 두 개의 int 포인터를 R로 잘못 스왑하려고 합니다.Martinho Fernandes는 지적합니다.두 int를 교환할 수 있습니다. 다음과 같은 경우:

int a, b;
intSwap(&a, &b);

기준별 값과 기준별 값의 차이를 이해해야 합니다.

기본적으로 C는 값별 전달만 지원합니다.따라서 변수를 함수에 전달할 때 변수를 직접 참조할 수 없습니다.변수를 스왑이 수행하는 함수로 변경하려면 기준 전달을 사용해야 합니다.C에서 기준 전달을 구현하려면 값을 참조 해제할 수 있는 포인터를 사용해야 합니다.

기능:

void intSwap(int* a, int* b)

두 개의 포인터 값을 intSwap에 전달하며 함수에서는 a/b가 가리키는 값을 교환하지만 포인터 자체는 교환하지 않습니다.그것이 R. Martinho & Dan Fego가 포인터가 아닌 두 정수를 교환한다고 말한 이유입니다.

chars의 경우 문자열이 더 복잡합니다.C의 문자열은 chars 배열로 구현되며, char*, 포인터가 문자열 값으로 참조합니다.그리고 참고로 char*를 전달하려면 char*의 폰터를 사용해야 하므로 char**를 얻을 수 있습니다.

아마도 아래 코드가 더 명확할 것입니다.

typedef char* str;
void strSwap(str* a, str* b);

구문 스왑(int&a, int&b)은 C++로, 참조를 직접 전달하는 것을 의미합니다.아마도 일부 C 컴파일러도 구현할 것입니다.

헷갈리지 말고 좀 더 명확하게 했으면 좋겠습니다.

이 예에서는 두 개의 int 포인터를 교환하지 않습니다.그것은 정수의 값을 교환합니다.pa그리고.pb가리키고 있습니다.다음은 이를 호출할 때 발생하는 상황에 대한 예입니다.

void Swap1 (int *pa, int *pb){
    int temp = *pa;
    *pa = *pb;
    *pb = temp;
}
int main()
{
    int a = 42;
    int b = 17;


    int *pa = &a;
    int *pb = &b;

    printf("--------Swap1---------\n");
    printf("a = %d\n b = %d\n", a, b);
    swap1(pa, pb);
    printf("a = %d\n = %d\n", a, a);
    printf("pb address =  %p\n", pa);
    printf("pa address =  %p\n", pb);
}

여기서의 출력은 다음과 같습니다.

a = 42
b = 17
pa address =  0x7fffdf933228
pb address =  0x7fffdf93322c
--------Swap---------
pa = 17
pb = 42
a = 17
b = 42
pa address =  0x7fffdf933228
pb address =  0x7fffdf93322c

값은 스왑되었지만 포인터의 주소는 스왑되지 않았습니다!

주소를 교환하려면 다음 작업을 수행해야 합니다.

void swap2 (int **pa, int **pb){
    int temp = *pa;
    *pa = *pb;
    *pb = temp;
}

그리고 주로 다음과 같은 함수를 호출합니다.swap2(&pa, &pb);

이제 주소와 포인터 값이 스왑됩니다. a그리고.b정수 a와 b가 초기화된 것과 동일한 값을 가집니다. 이는 정수 a와 b가 교환되지 않았기 때문입니다.swap2포인터가 가리키는 주소를 스왑합니다!:

a = 42
b = 17
pa address =  0x7fffddaa9c98
pb address =  0x7fffddaa9c9c
--------Swap---------
pa = 17
pb = 42
a = 42
b = 17
pa address =  0x7fffddaa9c9c
pb address =  0x7fffddaa9c98

C의 문자열은 char 포인터이며 문자열을 스왑하려면 char 포인터를 스왑해야 합니다.int의 예와 같이 주소를 교환하려면 이중 포인터가 필요합니다.

정수 값은 주소가 아닌 경우에도 스왑할 수 있지만 문자열은 기본적으로 문자 포인터입니다.단일 포인터를 매개 변수로 사용하여 하나의 문자를 스왑할있지만 문자열을 스왑하려면 문자 포인터가 이중 포인터여야 합니다.

C++에서 일하는 것을 즐기신다면, 다음을 이용해 보세요.

template<typename T>
void swapPrimitives(T& a, T& b)
{
    T c = a;
    a = b;
    b = c;
}

예의 에는 의경우.char*포인터 자체만 교환하고 포인터가 가리키는 데이터는 교환하지 않지만 대부분의 경우 괜찮습니까?

언급URL : https://stackoverflow.com/questions/8403447/swapping-pointers-in-c-char-int

반응형