在C中交换双指针

时间:2015-10-11 00:19:51

标签: c algorithm pointers

这是我的代码;我想交换下面的名字。我正在练习这个;

我得到的错误是

Segmentation fault

任何帮助将不胜感激。

void nameSwap(char **wife[3],char **husband[3])
{
  int i;
  char **tmp[3];
for(i=0;i<3;i++)
 {

  *tmp[i]=*wife[i];
  *wife[i] = *husband[i];
  *husband[i] = *tmp[i];
 } 

int main(int argc,char  *argv[])
{
char *name1[3]={"Chicago","University","Computer"};
char *name2[3]={"I","Love","Uchicago"};

int k;
char **p1[3];
char **p2[3];

for(k=0;k<3;k++)
{
*p1[k]=name1[k];
*p2[k]=name2[k];
}

for(k=0;k<3;k++)
{
printf("%s %s\n",*p1[k],*p2[k]);
}

nameSwap(&p1[3],&p2[3]);

for(k=0;k<3;k++)
{
printf("%s %s\n",*p1[k],*p2[k]);
}
return 0;

}

2 个答案:

答案 0 :(得分:1)

让我们从交换函数开始:它指向2个指向char的3个指针的数组。它可以声明为void nameSwap(char *wife[3], char *husband[3]),但请注意类似数组的语法具有误导性,实际上与此相同:void nameSwap(char *wife[], char *husband[])或者:void nameSwap(char **wife, char **husband)。在C中,指向char的指针数组作为指向char的指针传递。

为了执行交换,只需要一个临时变量,因为你一次只交换2个指针。

这是一个更正后的版本,使用[]语法强调wifehusband指向数组的事实,而不是单指针(就像argv一样{ {1}}):

main

然后让我们看一下void nameSwap(char *wife[], char *husband[]) { for (int i = 0; i < 3; i++) { char *tmp = wife[i]; wife[i] = husband[i]; husband[i] = tmp; } } 函数:

main

我希望这个解释可以帮助您更好地理解。指针和数组在C语言中是 棘手的东西。获得它的最佳方式与骑自行车相同:从已经了解艺术的朋友那里得到一些帮助。

答案 1 :(得分:1)

双指针意味着

char **

的情况
#include <stdio.h>

void nameSwap(char ***wife, char ***husband){
    char **tmp;

    tmp = *wife;
    *wife = *husband;
    *husband = tmp;
}

int main(void){
    char *name1[3]={"Chicago","University","Computer"};
    char *name2[3]={"I","Love","Uchicago"};

    int k;
    char **p1;
    char **p2;

    p1 = name1;
    p2 = name2;

    for(k=0;k<3;k++){
        printf("%s %s\n", p1[k], p2[k]);
    }

    nameSwap(&p1, &p2);

    for(k=0;k<3;k++){
        printf("%s %s\n", p1[k], p2[k]);
    }
    return 0;
}

指向char *var_name[3]

的指针的情况
#include <stdio.h>

void nameSwap(char *(**wife)[3], char *(**husband)[3]){
    char *(*tmp)[3];

    tmp = *wife;
    *wife = *husband;
    *husband = tmp;
}

int main(void){
    char *name1[3]={"Chicago","University","Computer"};
    char *name2[3]={"I","Love","Uchicago"};

    int k;
    char *(*p1)[3];
    char *(*p2)[3];

    p1 = &name1;
    p2 = &name2;

    for(k=0;k<3;k++){
        printf("%s %s\n", (*p1)[k], (*p2)[k]);
    }

    nameSwap(&p1, &p2);

    for(k=0;k<3;k++){
        printf("%s %s\n", (*p1)[k], (*p2)[k]);
    }
    return 0;
}