我的swap函数接受指针地址,但不交换指针.为什么呢?



当前结果为:交换后输入的第一个单词是temp1您输入的第二个单词是temp2

预期结果应该是:交换后输入的第一个单词是temp2<<期待不同的结果您输入的第二个单词是temp1<<期待不同的结果

#include <stdio.h>
#include <stdlib.h>
int main()
{
void swap1(char *pword1, char *pword2) {
printf("word1 is %pn",pword1);
printf("word2 is %pn",pword2);
char temp[50] = "";
char *ptemp = temp;
ptemp = pword1;
pword1 = pword2;
pword2 = ptemp;
printf("word1 is %pn",pword1);
printf("word2 is %pn",pword2);
return;
}
char word1[50];
char word2[50];
printf("Before swappingn");
printf("Enter the first wordn");
scanf("%s",word1);
printf("The first word you entered is %sn",word1);
char *pword1 = word1;
printf("Enter the second wordn");
scanf("%s",word2);
printf("The second word you entered is %sn",word2);
char *pword2 = word2;
swap1(pword1,pword2);
printf("nAfter swappingn");
printf("The first word you entered is %sn",pword1);
printf("The second word you entered is %sn",pword2);
return 0;
}

您还需要一个间接层次,但请参阅下面的注释。

让我们稍微简化一下——如果你想让一个函数交换任何非数组类型T的两个值,你必须传递指针给它们:

void swap( T *a, T *b )
{
T tmp = *a;
*a = *b;
*b = tmp;
}
int main( void )
{
T x = some_T_value;
T y = some_other_T_value;
swap( &x, &y );
}

我们

a == &x  // T * == T *
b == &y  // T * == T *
*a ==  x  // T   == T
*b ==  y  // T   == T

现在让我们将T替换为类型P *:

void swap( P **a, P **b ) // T *a == P * *a == P **a
{
P *tmp = *a;
*a = *b;
*b = tmp;
}
int main( void )
{
P *x = some_Pstar_value;
P *y = some_other_Pstar_value;
swap( &x, &y );
}

我们的关系仍然是一样的:

a == &x  // P ** == P **
b == &y  // P ** == P **
*a ==  x  // P *  == P *
*b ==  y  // P *  == P *

所有的语义都是完全相同的——ab总是比xy多一个间接层次,tmp总是和xy在同一间接层次,你总是传递&x&y——唯一的区别是类型。为了更清楚地说明这一点,我们再上一级,用R *替换P:

void swap( R ***a, R ***b ) 
{
R **tmp = *a;
*a = *b;
*b = tmp;
}
int main( void )
{
R **x = some_Rstarstar_value;
R **y = some_other_Rstarstar_value;
swap( &x, &y );
}
如果你想交换数组的内容,而不是指向数组的指针,你必须做一些不同的事情:

void swapArr( T *a, T *b, size_t bytes )
{
T tmp[size];
memcpy( tmp, a, size );
memcpy( a, b, size );
memcpy( b, tmp, size );
}
int main( void )
{
T a[N] = { ... };
T b[N] = { ... };
swap( a, b, sizeof a ); // no & operator
}

最新更新