Search code examples
cpass-by-referenceswapfunction-definition

What is the trick for swap_pointers to work?


I am doing an exercise where the task is to fix swap_pointer().

Two string should be swapped.

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

My work so far:

#include <stdio.h>

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

int main(void) {

    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 be printed second.";
    s2 = "I should be printed first.";

    /* swap_pointers(s1, s2); */

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

    return 0;
}

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

    int tmp;

    tmp = *x;
    *x = *y;
    *y = tmp;
}

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

    char tmp;

    tmp = *x;
    *x = *y;
    *y = tmp;
}

I think that not appending & to s1 and s2 before I pass them to the function for swap_pointers is the error?

If anyone can fix my issue here, please don't give the whole solution! I want to use what you give me as a tool to fix it by my own. If I really can't fix it by my own I will adress this later.

Ty in advance!


Solution

  • Let's at first consider this code snippet

    int a = 3, b = 4;
    
    swap_nums(&a, &b);
    

    To swap the objects a and b you need to pass then to the function swap_nums by reference through pointers to them. Thus within the function dereferencing the pointers we can get a direct access to original objects and change their values.

    void swap_nums(int *x, int *y) {
    
        int tmp;
    
        tmp = *x;
        *x = *y;
        *y = tmp;
    }
    

    The same we need to do with the variables s1 and s2. That is we need to pass them to the function swap_pointers by reference through pointers to them.

    So you need to write

    swap_ponters( &s1, &s2 );
    

    and the function will be declared and defined like

    void swap_ponters(char **x, char **y)
    {
        char *tmp = *x;
        *x = *y;
        *y = tmp;
    }
    

    In general if you have two objects like

    T a;
    T b;
    

    where T is some type specifier then to change the objects in a function you need to pass them to the function by reference through pointers to them. So the declaration of the function swap will look like

    void swap( T *a, T *b );
    

    and the function will be called like

    swap( &a, &b );
    

    In your program a and b has the type int, that is T is an alias for the type int.

    typedef int T;
    
    T a = 3, b = 4;
    

    so the function declaration will look like

      void swap_nums( T *x, T *y );
    

    For the variables s1 and s2 you can write

    typedef char *T;
    
    T s1, s2;
    

    and again the function declaration will look like

    void swap_pointers( T *x, T *y );
    

    and the function will be called like

    swap_pointers( &s1, &s2 );
    

    As in this case T is an alias for the type char * then the function declaration can be rewritten like

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