2013-06-24 70 views
2

我试图在这个问题上有一个裂缝。问题说,*“swap_nums似乎工作,但不swap_pointers。修复它。”*我是一个初学者的方式:)C中的指针(将地址传递给函数)

我相信我可以解决自己的问题,但麻烦是我有一个在C中理解一些编程概念有点困难。在这里我已经给出了需要编辑的给定代码。在此之下,我会展示我的思维过程。请注意:我需要一些提示而不是完整的解决方案。 :-)

#include <stdio.h> 
#include <stdlib.h> 

void swap_nums(int *x, int *y); 
void swap_pointers (char *x, char *y); 

int main (int argc, char *argv[]){ 

    int a = 3, b = 4; 
    char *s1, *s2; 
    swap_nums(&a, &b); 
    printf("a is %d\n", a); 
    printf("b is %d\n", b); 

    s1 = "I should print second"; 
    s2 = "I should print first"; 

    swap_pointers(s1, s2); 
    printf("s1 is %s\n", s1); 
    printf("s2 is %s\n", s2); 

    return EXIT_SUCCESS; } 

void swap_nums(int *x, int *y){ 

    int temp; 
    temp = *x; 
    *x = *y; 
    *y = temp; } 

void swap_pointers (char *x, char *y){ 

    char *temp; 
    temp = x; 
    x = y; 
    y = temp; } 

我的思考过程:这是一个程序,我相信会交换整数变量a和b。然后它将采用两个声明的字符串并交换它们。

主要功能:

int a = 3, b = 4; 

分配变量a和b分别3和4。

char *s1, *s2; 

创建一个字符指针变量(其将保持字符的地址)

swap_nums(&a, &b); 

功能swap_nums正在发生。我现在要去解释我的思维过程。

void swap_nums(int *x, int *y){ 

所以我不熟悉将函数传递到函数中,如果我在这里错了,是否有人能够纠正我要说的话?

我看到它的方式,我们将a和b的地址传递给函数swap_nums。但是,我们如何得到int * x和int * y?我在这里有点困惑。有人可以向我解释这一点吗?

回答

0

指针可能是一个地址,但它仍然通过值传递给函数(如C中的所有东西)。要交换两个指针,您需要指向指针的指针。


这里有你想要的东西:

#include <stdio.h> 

int main(void) 
{ 
    char x='s'; 
    char y='o'; 
    char *a = &x; 
    char *b = &y; 
    printf("a is %x\n",a); 
    printf("b is %x\n",b); 
    printf("swapping\n"); 
    swap_pointers(&a,&b); 
    printf("a is %x\n",a); 
    printf("b is %x\n",b); 

} 

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

这里是一个暗示,有什么不对的:

s1 = "I should print second"; 
s2 = "I should print first"; 

什么是s1的类型,什么是“我应该打印第二个”?以及如何将字符串文字保存到变量?

8

在C中,一切都作为值传递,包括指针。因此,交换指针的代码会操纵指针副本,从而保持原来的状态不变。

为了交换指针,您需要将指针传递给指针,而不是简单的指针。当然,里面的功能,你需要解引用您在swap_numbers做了同样的方法添加的级别:

void swap_pointers (char **x, char **y) { 
    char *temp; 
    temp = *x; 
    *x = *y; 
    *y = temp; 
} 
+0

绝对正确。如果你想变得有趣,你也可以XOR交换它们;){if(x!= y){* x = * x^* y; * y = * x^* y; * x = * x^* y; }} –

0

提示:通过价值分析呼叫,并通过引用调用,让您的查询清楚的认识。

0

想到指针只是另一个变量,我们必须将一个指针传递给函数swap_pointers()

0

这就是你需要我猜。基本和充足。

void swap(char **s1, char **s2){ 
char *temp=*s1; 
*s1=*s2; 
*s2=temp; 
} 

int main(){ 
char *s1="second"; 
char *s2="first"; 
swap(&s1,&s2); 
printf("%s",s1); 
printf("%s",s2); 
return 0; 

} 

希望这会有所帮助。