Functions and Character Single Dimension Array

In this section, you are going to learn

What are the calling conventions of character single dimension array ?

Call by Value

Call by Reference

char array_name[Column];

Consider a Character Single Dimension Array

char a[10];

Let us answer few basic questions in this array

If fun(x) is the function call, then fun(typeof(x)) is the prototype / definition

Function Call

Function Definition

Observations

fun(a[0])

void fun(char x) { }

  • Call by Value

fun(a[1])

void fun(char x) { }

  • Call by Value

fun(a[9])

void fun(char x) { }

  • Call by Value

fun(&a[0])

void fun(char *p) { }

  • Call by Reference

fun(&a[1])

void fun(char *p) { }

  • Call by Reference

fun(&a[9])

void fun(char *p) { }

  • Call by Reference

fun(*a)

void fun(char x) { }

  • Call by Value

fun(*(a + 1))

void fun(char x) { }

  • Call by Value

fun(*(a + 9))

void fun(char x) { }

  • Call by Value

fun(a)

void fun(char *p) { }

  • Call by Reference

fun(a + 1)

void fun(char *p) { }

  • Call by Reference

fun(a + 9)

void fun(char *p) { }

  • Call by Reference

fun(&a)

void fun(char (*p) [10] ) { }

  • Call by Reference

If Declaration has ONE dereference operator, and

  • Expression has ONE dereference operator [], and

  • Expression does not have &

  • then it is call by value

If Declaration has ONE dereference operators, and

  • Expression has ONE dereference operator *, and

  • Expression does not have &

  • then it is call by value

If Declaration has ONE dereference operator, and

  • Expression has ONE dereference operators [] or *, and

  • Expression has ONE &

  • then it is call by reference

  • Example : &a[0]

If Declaration has ONE dereference operator, and

  • Expression has ZERO dereference operator [ ] or *, and

  • Expression has ZERO & operator

  • then it is call by reference

  • Example : a + 1, a + 4

If Declaration has ONE dereference operator, and

  • Expression has ZERO dereference operator [ ] or *, and

  • Expression has ONE & operator

  • then it is call by reference

  • Example : &a

Let us look at examples of Call by Value

Example for Call By Value with [ ]

  • Step 1 : Define a character array a

char a[10] = "Laptop";
  • Step 2 : Pass an individual character a[2] to a function. Call by Value

fun(a[2]);

Individual array elements can be accessed using [ ]

In this case a[2] is third character in the array

a[2] is fully dereferenced and there is no & symbol in fun(a[2]). Hence this is Call By Value

  • Step 3 : Define function fun

void fun(char x)
{

}
  • Step 4 : Change value of x inside function fun

void fun(char x)
{
        printf("x = %c\n", x);
        x = 'b';
}
  • See the full program below

#include <stdio.h>

void fun(char x)
{
        printf("x = %c\n", x);
        x = 'b';
}

int main(void)
{
        char a[10] = "Laptop";

        fun(a[2]);

        printf("a = %s\n", a);

        return 0;
}
  • Output is as below

x = p
a = Laptop

Changing value of x inside function fun DOES NOT change a[2] in array a

Example for Call By Value with *

  • Step 1 : Define a character array a

char a[10] = "Laptop";
  • Step 2 : Pass an individual character *(a + 2) to a function. Call by Value

fun( *(a + 2) );

Individual array elements can be accessed using *

In this case *(a + 2) is third character in the array

*(a + 2) is fully dereferenced and there is no & symbol in fun( *(a + 2) ). Hence this is Call By Value

  • Step 3 : Define function fun

void fun(char x)
{

}
  • Step 4 : Change value of x inside function fun

void fun(char x)
{
        printf("x = %c\n", x);
        x = 'b';
}
  • See the full program below

#include <stdio.h>

void fun(char x)
{
        printf("x = %c\n", x);
        x = 'b';
}

int main(void)
{
        char a[10] = "Laptop";

        fun( *(a + 2) );

        printf("a = %s\n", a);

        return 0;
}
  • Output is as below

x = p
a = Laptop

Changing value of x inside function fun DOES NOT change *(a + 2) in array a

Remember a[2] and *(a + 2) are one and the same

Let us look at examples of Call by Reference

Example for Call By Reference with &a[ ]

  • Step 1 : Define a character array a

char a[10] = "Laptop";
  • Step 2 : Pass address of an individual character &a[2] to a function. Call by Reference

fun( &a[2] );

Address of individual array elements can be accessed using &

In this case &a[2] is the address of third character in the array

Since we are passing address of third character to function fun, it is called call by reference with respect to third character

  • Step 3 : Define function fun

void fun(char *x)
{

}
  • Step 4 : Change value of *x inside function fun

void fun(char *x)
{
        printf("*x = %c\n", *x);
        *x = 'b';
}
  • See the full program below

#include <stdio.h>

void fun(char *x)
{
        printf("*x = %c\n", *x);
        *x = 'b';
}

int main(void)
{
        char a[10] = "Laptop";

        fun( &a[2] );

        printf("a = %s\n", a);

        return 0;
}
  • Output is as below

*x = p
a = Labtop

Changing value of *x inside function fun CHANGES a[2] in array a

Example for Call By Reference with (a + x)

  • Step 1 : Define a character array a

char a[10] = "Laptop";
  • Step 2 : Pass address of individual character a + 2 to a function. Call by Reference

fun( a + 2 );

In this case a + 2 is the address of third character in the array

Since we are passing address of third character to function fun, it is called call by reference with respect to third character

  • Step 3 : Define function fun

void fun(char *x)
{

}
  • Step 4 : Change value of *x inside function fun

void fun(char *x)
{
        printf("*x = %c\n", *x);
        *x = 'b';
}
  • See the full program below

#include <stdio.h>

void fun(char *x)
{
        printf("*x = %c\n", *x);
        *x = 'b';
}

int main(void)
{
        char a[10] = "Laptop";

        fun( a + 2 );

        printf("a = %s\n", a);

        return 0;
}
  • Output is as below

*x = p
a = Labtop

Changing value of *x inside function fun CHANGES a[2] in array a

  • Step 1 : Consider a character array

char a[10] = "Laptop123";
  • Step 2 : Pass full array array to a function

fun( a );

Note that we are passing starting address of array

Hence function fun has read and write access to all Bytes of array

  • Step 3 : Define a function

void fun(char *x)
{
        printf("x = %s\n", x);

        strcpy(x, "Laptop456");
}

function fun has access to all characters

  • See full program below

#include <stdio.h>
#include <string.h>

void fun(char *x)
{
        printf("x = %s\n", x);

        strcpy(x, "Laptop456");
}

int main(void)
{
        char a[10] = "Laptop123";

        fun(a);

        printf("a = %s\n", a);

        return 0;
}
  • Step 1 : Consider a character array

char a[10] = "Laptop123";
  • Step 2 : Pass full array by reference

fun( a + 5 );

Note that we are passing part of the array by reference

In this case, we are passing address of 6th character

Hence function fun has read and write access to Bytes 5, 6, 7, 8, 9 in forward direction

Hence function fun has read and write access to Bytes 0, 1, 2, 3, 4 in backward direction

  • Step 3 : Define a function

void fun(char *x)
{
        printf("x = %s\n", x);

        x[-5] = 'b'; // Same as a[0]
        x[-4] = 'a'; // Same as a[1]
        x[-3] = 'p'; // Same as a[2]
        x[-2] = 't'; // Same as a[3]
        x[-1] = 'a'; // Same as a[4]
        x[0]  = 'p'; // Same as a[5]
        x[1]  = '4'; // Same as a[6]
        x[2]  = '5'; // Same as a[7]
        x[3]  = '6'; // Same as a[8]
}

Note the relative access mechanism used inside function fun

  • See full program below

#include <stdio.h>
#include <string.h>

void fun(char *x)
{
        printf("x = %s\n", x);

        x[-5] = 'b'; // Same as a[0]
        x[-4] = 'a'; // Same as a[1]
        x[-3] = 'p'; // Same as a[2]
        x[-2] = 't'; // Same as a[3]
        x[-1] = 'a'; // Same as a[4]
        x[0]  = 'p'; // Same as a[5]
        x[1]  = '4'; // Same as a[6]
        x[2]  = '5'; // Same as a[7]
        x[3]  = '6'; // Same as a[8]
}

int main(void)
{
        char a[10] = "Laptop123";

        fun(a + 5);

        printf("a = %s\n", a);

        return 0;
}
  • Output is as below

x = p123
a = baptap456
  • Step 1 : Consider a character array

char a[10] = "Laptop123";
  • Step 2 : Pass the address of array a to function fun

fun(&a);
  • Step 3 : Define the function fun

void fun( char (*ptr)[10] )
{

}

Note that char (*ptr)[10] is pointer to an array of 10 characters

Which means incrementing ptr will increment by 10 Bytes and decrementing ptr will decrement by 10 Bytes

  • Step 4 : Access full string inside function fun

void fun( char (*ptr)[10] )
{
        printf("fun : String is %s\n", *ptr);

        // Change full string
        strcpy(*ptr, "Laptop456");
}
  • Step 5 : Access individual characters inside function fun

void fun( char (*ptr)[10] )
{
        //Change individual characters
        (*ptr)[0] = 'g';
        (*ptr)[1] = 'a';
        (*ptr)[2] = 'p';
        (*ptr)[3] = 't';
        (*ptr)[4] = 'a';
        (*ptr)[5] = 'p';
        (*ptr)[6] = '4';
        (*ptr)[7] = '5';
        (*ptr)[8] = '6';
        (*ptr)[9] = '\0';
}
  • See the full program below

#include <stdio.h>
#include <string.h>

void fun( char (*ptr)[10] )
{
        printf("fun : String is %s\n", *ptr);

        // Change full string
        strcpy(*ptr, "Laptop456");

        //Change individual characters
        (*ptr)[0] = 'g';
        (*ptr)[1] = 'a';
        (*ptr)[2] = 'p';
        (*ptr)[3] = 't';
        (*ptr)[4] = 'a';
        (*ptr)[5] = 'p';
        (*ptr)[6] = '4';
        (*ptr)[7] = '5';
        (*ptr)[8] = '6';
        (*ptr)[9] = '\0';
}

int main(void)
{
        char a[10] = "Laptop123";

        fun(&a);

        printf("main : String is %s\n", a);

        return 0;
}
  • Output is as below

fun  : String is Laptop123
main : String is gaptap456