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
Revisit Basics : Basics of Character Single Dimension Array
Topics in this section,
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) { } |
|
fun(a[1]) |
void fun(char x) { } |
|
fun(a[9]) |
void fun(char x) { } |
|
fun(&a[0]) |
void fun(char *p) { } |
|
fun(&a[1]) |
void fun(char *p) { } |
|
fun(&a[9]) |
void fun(char *p) { } |
|
fun(*a) |
void fun(char x) { } |
|
fun(*(a + 1)) |
void fun(char x) { } |
|
fun(*(a + 9)) |
void fun(char x) { } |
|
fun(a) |
void fun(char *p) { } |
|
fun(a + 1) |
void fun(char *p) { } |
|
fun(a + 9) |
void fun(char *p) { } |
|
fun(&a) |
void fun(char (*p) [10] ) { } |
|
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 functionfun
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 functionfun
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 functionfun
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 functionfun
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 functionfun
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
Other topics of character and functions
Current Module
Previous Module
Next Module
Other Modules