DIY sysex fader box status and questions.

Peter Korsten peter at severity-one.com
Tue May 1 22:45:28 CEST 2012


Hi Tom,

If you want to pass a variable by reference instead of by value in C, 
you can't really do that. What you have to do is pass a pointer to the 
variable, instead of the variable itself.

Consider that you have this function:

void increase( int a )
{
     a++;
}

int main( int argc, char **argv )
{
     int b = 1;
     increase( b );
     printf( "b=%d\n", b );
     return 0;
}

This won't do any good. What you have to do instead is this:

void increase( int *a )
{
     (*a)++;
}

The parentheses are not really necessary, but they're there to make it 
easier for you to see what's going on. You invoke it as follows:

int main( int argc, char **argv )
{
     int b = 1;
     increase( &b );
     printf( "b=%d\n", b );
     return 0;
}

You see the use of the '*' and '&'. In the function declaration, the '*' 
means 'pointer to', in this case a pointer to an int. In the '(*a)++' 
statement, the '*' means 'the contents of the memory address pointed to 
by "a"'. The '&' operator means 'the address of the variable'.

It's essential to understand that the variable 'a' in the 'increase' 
function is NOT an integer, but a POINTER TO an integer. The pointer 
needs to point to something, otherwise it's meaningless. You could do 
the following:

     increase( NULL );

and get a segmentation violation, if your CPU has an MMU. Otherwise, 
you'll be trashing your memory.

Now, how about arrays? Well, there's no real difference between arrays 
and pointers in C, so you're in luck. To pass an array to a function, 
you simply pass the array variable. For example:

void increase( int *a, int size )
{
     int i;
     for( i = 0; i < size; i++ )
         a[i]++;
}

int main( int argc, char **argv )
{
     int b[] = { 0, 1, 2, 3 };
     increase( b, sizeof b / sizeof (int) );
     for( i = 0; i < sizeof b / sizeof (int); i++ )
         printf( "b[%d]=%d\n", i, b[i] );
     return 0;
}

(Please note that I'm typing this from heart and haven't actually tested 
the code, but it should be OK.)

Knowing pointers is the key to understanding C, but it may take you a 
while to wrap your head around them.

- Peter


More information about the music-bar mailing list