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
'programing' 카테고리의 다른 글
매개 변수를 사용하는 Bash 별칭을 만드시겠습니까? (0) | 2023.06.07 |
---|---|
Handling applicationDidBeautive - "앱이 Active가 되었을 때 뷰 컨트롤러가 어떻게 응답할 수 있습니까?" (0) | 2023.06.07 |
Firestore 보안 규칙: 문서에서 배열에서 사용자 ID 검색 (0) | 2023.06.07 |
GCC에 대한 "-Wl, option"과 "-Xlinker option" 구문 사이에 차이점이 있습니까? (0) | 2023.06.07 |
Vuex 유휴 커밋/버퍼 상태 변경 (0) | 2023.06.07 |