为什么这个交换功能不起作用?(在C中交换字符串)

为什么这个交换功能不起作用?(在C中交换字符串),c,pointers,pass-by-reference,swap,pass-by-value,C,Pointers,Pass By Reference,Swap,Pass By Value,我试图交换字符串数组中的两个条目,但调用swap函数时不交换 swap(char*, char*); int main() { char *ptsr[2] = { "x", "y" }; swap(ptsr[0], ptsr[1]); } swap(char *t1, char *t2) { char *t; t = t1; t1 = t2; t2 = t; } 有人能识别并解释我的错误吗?问题中的函数

我试图交换字符串数组中的两个条目,但调用swap函数时不交换

swap(char*, char*);

int main() {
    char *ptsr[2] = { "x", "y" };
    swap(ptsr[0], ptsr[1]);
}

swap(char *t1, char *t2) {
    char *t;
    t = t1;
    t1 = t2;
    t2 = t;
}

有人能识别并解释我的错误吗?

问题中的函数只交换其参数的值。参数是数组元素的副本,因此swap函数无效

要交换数组中的指针,必须传递其地址并更改交换函数的原型:

#include <stdio.h>

void swap(char **t1, char **t2) {
    char *t;
    t = *t1;
    *t1 = *t2;
    *t2 = t;
}

int main() {
    char *ptsr[2] = { "x", "y" };

    swap(&ptsr[0], &ptsr[1]);

    printf("pstr: { \"%s\", \"%s\" }\n", pstr[0], pstr[1]);
    return 0;
}

问题中的函数只交换其参数的值。参数是数组元素的副本,因此swap函数无效

要交换数组中的指针,必须传递其地址并更改交换函数的原型:

#include <stdio.h>

void swap(char **t1, char **t2) {
    char *t;
    t = *t1;
    *t1 = *t2;
    *t2 = t;
}

int main() {
    char *ptsr[2] = { "x", "y" };

    swap(&ptsr[0], &ptsr[1]);

    printf("pstr: { \"%s\", \"%s\" }\n", pstr[0], pstr[1]);
    return 0;
}

C是严格意义上的传递值。将ptsr[0]和pstr[1]的值传递给swap。它在保留这两个值的位置进行交换,但这对调用函数没有影响。考虑:

swap (int v1, int v2)
{
    int t;
    t = v1;
    v1 = v2;
    v2 = t;
}
这与swap函数相同,只是使用int。应该很清楚,如果调用swap1,2;,swap函数只是将2放在它存储1的地方,反之亦然,但这对调用者中的任何内容都没有影响

如果执行此操作,则相同:

int i = 2;
int j = 3;
swap(i,j);
char* j = "hello";
char* k = "world";
swap(j,k);
由于传递给swap的只是值2和3,因此它不会以任何方式影响i和j的值

如果您执行以下操作,则交换功能也将如此:

int i = 2;
int j = 3;
swap(i,j);
char* j = "hello";
char* k = "world";
swap(j,k);
函数接收hello和world,并交换存储这两个指针的位置。这对调用者中的j或k没有影响


C是严格意义上的传递值。无论传递给函数的参数是什么,函数都只接收值。

C严格来说是按值传递的。将ptsr[0]和pstr[1]的值传递给swap。它在保留这两个值的位置进行交换,但这对调用函数没有影响。考虑:

swap (int v1, int v2)
{
    int t;
    t = v1;
    v1 = v2;
    v2 = t;
}
这与swap函数相同,只是使用int。应该很清楚,如果调用swap1,2;,swap函数只是将2放在它存储1的地方,反之亦然,但这对调用者中的任何内容都没有影响

如果执行此操作,则相同:

int i = 2;
int j = 3;
swap(i,j);
char* j = "hello";
char* k = "world";
swap(j,k);
由于传递给swap的只是值2和3,因此它不会以任何方式影响i和j的值

如果您执行以下操作,则交换功能也将如此:

int i = 2;
int j = 3;
swap(i,j);
char* j = "hello";
char* k = "world";
swap(j,k);
函数接收hello和world,并交换存储这两个指针的位置。这对调用者中的j或k没有影响


C是严格意义上的传递值。无论传递给函数的参数是什么,函数都只接收。

函数按值接受其参数

这就是您忘记为其指定返回类型void的函数交换

处理表达式ptsr[0]和ptsr[1]的值的副本。对副本进行倒角不会影响原始指针

您可以想象函数定义及其调用的方式如下

swap(ptsr[0], ptsr[1]);

//...

void swap( /*char *t1, char *t2*/) {
    char *t1 = ptsr[0], *t2 = ptsr[1];
    char *t;
    t = t1;
    t1 = t2;
    t2 = t;
}
如您所见,变量和ptsr[0]和ptsr[1]没有更改

要更改一个对象,尤其是在函数中可能有指针类型的对象,需要通过引用将其传递给函数

在C中,通过引用传递意味着通过指向对象的指针间接传递对象

所以函数交换看起来像

void swap(char **t1, char **t2) {
    char *t;
    t = *t1;
    *t1 = *t2;
    *t2 = t;
}
必须调用函数,比如

swap( &ptsr[0], &ptsr[1] );
还是一样

swap(ptsr, ptsr + 1);

取消对指针t1和t2的引用后,函数可以直接访问原始指针ptsr[0]和ptsr[1],交换它们的值。

函数按值接受它们的参数

这就是您忘记为其指定返回类型void的函数交换

处理表达式ptsr[0]和ptsr[1]的值的副本。对副本进行倒角不会影响原始指针

您可以想象函数定义及其调用的方式如下

swap(ptsr[0], ptsr[1]);

//...

void swap( /*char *t1, char *t2*/) {
    char *t1 = ptsr[0], *t2 = ptsr[1];
    char *t;
    t = t1;
    t1 = t2;
    t2 = t;
}
如您所见,变量和ptsr[0]和ptsr[1]没有更改

要更改一个对象,尤其是在函数中可能有指针类型的对象,需要通过引用将其传递给函数

在C中,通过引用传递意味着通过指向对象的指针间接传递对象

所以函数交换看起来像

void swap(char **t1, char **t2) {
    char *t;
    t = *t1;
    *t1 = *t2;
    *t2 = t;
}
必须调用函数,比如

swap( &ptsr[0], &ptsr[1] );
还是一样

swap(ptsr, ptsr + 1);

将指针解引用到指针t1和t2时,函数可以直接访问原始指针ptsr[0]和ptsr[1],交换它们的值。

如果使用int执行此操作,您认为swap1,2;可以吗?没有交换的返回类型?如果你使用int,你认为swap1,2;可以吗?没有交换的返回类型?