Functions and Integer Triple Dimension Array ================================================= In this section, you are going to learn .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What are the calling conventions of integer triple dimension array ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Call by Value .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Call by Reference .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Revisit Basics : :doc:`../../array_n_ptrs/arrays_n_ints/int_td_array` .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Topics in this section, * :ref:`Integer Triple Dimension Array : Syntax ` * :ref:`Integer Triple Dimension Array : FAQs ` * :ref:`Integer Triple Dimension Array : fun(expression) ` * :ref:`Rules for Call By Value ` * :ref:`Example : Call by Value : Pass Integer : a[1][1][1] ` * :ref:`Example : Call by Value : Pass Integer : ***a ` * :ref:`Rules for Call By Reference ` * :ref:`Example : Call by Reference : &a[1][1] ` * :ref:`Example : Call by Reference : a[1] ` * :ref:`Examples of Call by Value ` * :ref:`Example 1 : Call by Value : Pass Integer : a[0][0][0], a[1][0][0], a[2][0][0] ` * :ref:`Example 2 : Call by Value : Pass Integer : \*\*\*a, \*(\*(\*(a + 1) + 0) + 0), \*(\*(\*(a + 2) + 0) + 0) ` * :ref:`Examples of Call by Reference ` * :ref:`Example 3 : Call by Reference : Pass Single dimension arrays which are part of a triple dimension array to a function ` * :ref:`Example 4 : Call by Reference : Pass Address of Single dimension arrays which are part of a triple dimension array to a function ` * :ref:`Example 5 : Call by Reference : Pass Double dimension arrays which are part of a Triple dimension array to a function ` * :ref:`Example 6 : Call by Reference : Pass Address of Double dimension arrays which are part of a Triple dimension array to a function ` * :ref:`Example 7 : Call by Reference : Pass Address of Triple Dimension array to a function ` .. _funcs_n_ptrs_int_td_array_ex_0: .. tab-set:: .. tab-item:: Integer Triple Dimension Array : Syntax .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow int array_name[Block][Row][Column]; .. _funcs_n_ptrs_int_td_array_ex_0_1: .. tab-set:: .. tab-item:: Integer Triple Dimension Array : FAQs Consider a integer triple dimension array .. code-block:: c int a[2][3][4]; .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Let us answer few basic questions in this array .. _funcs_n_ptrs_int_td_array_ex_6: .. tab-set:: .. tab-item:: Integer Triple Dimension Array : fun(expression) .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow If ``fun(x)`` is the function call, then ``fun(typeof(x))`` is the prototype / definition ========================== ================================ ========================================================================== Function Call Function Definition Observations ========================== ================================ ========================================================================== fun(a[0][0][0]) void fun(int x) {} * Call by Value fun(a[1][0][0]) void fun(int x) {} * Call by Value fun(a[2][0][0]) void fun(int x) {} * Call by Value fun(&a[0][0][0]) void fun(int \*p) {} * Call by Reference fun(&a[1][0][0]) void fun(int \*p) {} * Call by Reference fun(&a[2][0][0]) void fun(int \*p) {} * Call by Reference fun(a[0][0]) void fun(int \*p) {} * Call by Reference fun(a[1][0]) void fun(int \*p) {} * Call by Reference fun(a[2][0]) void fun(int \*p) {} * Call by Reference fun(&a[0][0]) void fun(int (\*p)[5]) {} * Call by Reference fun(&a[1][0]) void fun(int (\*p)[5]) {} * Call by Reference fun(&a[2][0]) void fun(int (\*p)[5]) {} * Call by Reference fun(\*\*a) void fun(int \*p) {} * Call by Reference fun(\*(\*(a + 1) + 0)) void fun(int \*p) {} * Call by Reference fun(\*(\*(a + 2) + 0)) void fun(int \*p) {} * Call by Reference fun(a[0]) void fun(int (\*p)[5]) {} * Call by Reference fun(a[1]) void fun(int (\*p)[5]) {} * Call by Reference fun(a[2]) void fun(int (\*p)[5]) {} * Call by Reference fun(&a[0]) void fun(int (\*p)[4][5]) {} * Call by Reference fun(&a[1]) void fun(int (\*p)[4][5]) {} * Call by Reference fun(&a[2]) void fun(int (\*p)[4][5]) {} * Call by Reference fun(\*a) void fun(int (\*p)[5]) {} * Call by Reference fun(\*(a + 1)) void fun(int (\*p)[5]) {} * Call by Reference fun(\*(a + 2)) void fun(int (\*p)[5]) {} * Call by Reference fun(a) void fun(int (\*p)[4][5]) {} * Call by Reference fun(a + 1) void fun(int (\*p)[4][5]) {} * Call by Reference fun(a + 2) void fun(int (\*p)[4][5]) {} * Call by Reference fun(&a) void fun(int (\*p)[3][4][5]) {} * Call by Reference ========================== ================================ ========================================================================== .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Let us understand the reason behind above prototypes ! .. _funcs_n_ptrs_int_td_array_ex_8: .. tab-set:: .. tab-item:: Rules for Call By Value .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow If Declaration has THREE dereference operators, and * Expression has THREE dereference operators \* \* \*, and * Expression does not have ``&`` * then it is call by value .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow If Declaration has THREE dereference operators, and * Expression has THREE dereference operators \* \* [ ], and * Expression does not have ``&`` * then it is call by value .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow If Declaration has THREE dereference operators, and * Expression has THREE dereference operators \* [ ] [ ], and * Expression does not have ``&`` * then it is call by value .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow If Declaration has THREE dereference operators, and * Expression has THREE dereference operators [] [] [], and * Expression does not have ``&`` * then it is call by value .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Let us look at examples .. _funcs_n_ptrs_int_td_array_ex_9: .. tab-set:: .. tab-item:: Example 1 : Call by Value : Pass Integer : a[1][1] * Step 1 : Consider an array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 1 : Declaration has THREE dereference operators [ ], [ ] and [ ] * Step 2 : Consider an expression ``a[1][1][1]`` .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 2 : Expression has THREE dereference operators [ ], [ ] and [ ] .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Note : ``[ ]`` and ``*`` are dereference operators .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 3 : Expression DOES NOT have ``&`` operator .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Hence ``a[1][1][1]`` is Call By Value .. _funcs_n_ptrs_int_td_array_ex_10: .. tab-set:: .. tab-item:: Example 2 : Call by Value : Pass Integer : \*\*\*a * Step 1 : Consider an array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 1 : Declaration has THREE dereference operators [ ], [ ] and [ ] * Step 2 : Consider an expression ``***a`` .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 2 : Expression has THREE dereference operators \*, \* and \* .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Note : ``[ ]`` and ``*`` are dereference operators .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 3 : Expression DOES NOT have ``&`` operator .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Hence ``***a`` is Call By Value .. _funcs_n_ptrs_int_td_array_ex_11: .. tab-set:: .. tab-item:: Rules for Call By Reference .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow If Declaration has THREE dereference operators, and * Expression has THREE dereference operators \* \* \* OR \* \* [] OR \* [] [] OR [] [] [] and * Expression has & * then it is call by reference * Example : &a[0][0][0], &a[1][2][3] .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow If Declaration has THREE dereference operators, and * Expression has TWO dereference operator \* \* OR [] [] OR \* [] * then it is call by reference * Example : a[0][0] .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow If Declaration has THREE dereference operators, and * Expression has ONE dereference operators, \* OR [ ] * then it is call by reference * Example : a[0] .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow If Declaration has THREE dereference operators, and * Expression has ZERO dereference operators * then it is call by reference * Example : a .. _funcs_n_ptrs_int_td_array_ex_12: .. tab-set:: .. tab-item:: Example 1 : Call by Reference : &a[1][1][1] * Step 1 : Consider an array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 1 : Declaration has THREE dereference operators [ ] [ ] and [ ] * Step 2 : Consider an expression ``&a[1][1][1]`` .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 2 : Expression has THREE dereference operators [ ] [ ] and [ ] .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Note : ``[ ]`` and ``*`` are dereference operators .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 3 : Expression has ``&`` operator .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Hence ``&a[1][1][1]`` is Call By Reference .. _funcs_n_ptrs_int_td_array_ex_13: .. tab-set:: .. tab-item:: Example 2 : Call by Reference : a[1] * Step 1 : Consider an array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 1 : Declaration has THREE dereference operators [ ] [ ] and [ ] * Step 2 : Consider an expression ``a[1]`` .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 2 : Expression has ONE dereference operator .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Note : ``[ ]`` and ``*`` are dereference operators .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 3 : Expression DOES NOT have ``&`` operator .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Hence ``a[1]`` is Call By Reference .. _funcs_n_ptrs_int_td_array_examples_call_by_value: .. tab-set:: .. tab-item:: Examples of Call by Value .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Let us look at examples of Call by Value .. _funcs_n_ptrs_int_td_array_ex_15: .. tab-set:: .. tab-item:: Example 1 : Call by Value : Pass Integer : a[0][0][0], a[1][0][0], a[2][0][0] * Step 1 : Consider a THREE dimensional array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; * Step 2 : Pass a[0][0][0], a[1][0][0], a[2][0][0] to a function ``fun`` .. code-block:: c fun(a[0][0][0]); fun(a[1][0][0]); * Step 3 : Define function ``fun`` .. code-block:: c void fun(int c) { c = 99; } * Step 4 : Note that it is call by Value for below reason .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 1 : Declaration has THREE dereference operators [ ] [ ] and [ ] .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 2 : Expression has THREE dereference operators [ ] [ ] and [ ] .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 3 : Expression DOES NOT have ``&`` operator .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Means changing value of integer inside function DOES NOT affect value of integer in Caller ! * See full program below .. code-block:: c #include void fun(int c) { c = 99; } int main(void) { int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; printf("----- Before Call by Value -----\n"); printf("a[0][0][0] = %d\n", a[0][0][0]); printf("a[1][0][0] = %d\n", a[1][0][0]); fun(a[0][0][0]); fun(a[1][0][0]); printf("----- After Call by Value -----\n"); printf("a[0][0][0] = %d\n", a[0][0][0]); printf("a[1][0][0] = %d\n", a[1][0][0]); return 0; } * Output is as below .. code-block:: c ----- Before Call by Value ----- a[0][0][0] = 1 a[1][0][0] = 13 ----- After Call by Value ----- a[0][0][0] = 1 a[1][0][0] = 13 .. _funcs_n_ptrs_int_td_array_ex_16: .. tab-set:: .. tab-item:: Example 2 : Call by Value : Pass Integer : \*\*\*a, \*(\*(\*(a + 1) + 0) + 0), \*(\*(\*(a + 2) + 0) + 0) * Step 1 : Consider a two dimensional array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; * Step 2 : Pass \*\*\*a, \*(\*(\*(a + 1) + 0) + 0), \*(\*(\*(a + 2) + 0) + 0) to a function ``fun`` .. code-block:: c fun( ***a ); fun( *(*(*(a + 1) + 0) + 0) ); * Step 3 : Define function ``fun`` .. code-block:: c void fun(int c) { c = 99; } * Step 4 : Note that it is call by Value for below reason .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 1 : Declaration has THREE dereference operators [ ] [ ] and [ ] .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 2 : Expression has THREE dereference operators \* \* and \* .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Condition 3 : Expression DOES NOT have ``&`` operator .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Means changing value of integer inside function DOES NOT affect value of integer in Caller ! * See full program below .. code-block:: c #include void fun(int c) { c = 99; } int main(void) { int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; printf("----- Before call by value -----\n"); printf("***a = %d\n", ***a); printf("*(*(*(a + 1) + 0) + 0) = %d\n", *(*(*(a + 1) + 0) + 0)); fun( ***a ); fun( *(*(*(a + 1) + 0) + 0) ); printf("----- After call by value -----\n"); printf("***a = %d\n", ***a); printf("*(*(*(a + 1) + 0) + 0) = %d\n", *(*(*(a + 1) + 0) + 0)); return 0; } * Output is as below .. code-block:: c ----- Before call by value ----- ***a = 1 *(*(*(a + 1) + 0) + 0) = 13 ----- After call by value ----- ***a = 1 *(*(*(a + 1) + 0) + 0) = 13 .. _funcs_n_ptrs_int_td_array_examples_call_by_reference: .. tab-set:: .. tab-item:: Examples of Call by Value .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Let us look at examples of Call by Reference .. _funcs_n_ptrs_int_td_array_ex_17: .. tab-set:: .. tab-item:: Example 3 : Call by Reference : Pass Single dimension arrays which are part of a triple dimension array to a function * Step 1 : Consider a two dimensional array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow There are 6 single dimension arrays in ``int a[2][3][4]`` a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] * Step 2.1 : Method 1 : Pass a[0][0], a[1][0] to a function ``fun`` .. code-block:: c fun( a[0][0] ); fun( a[1][0] ); * Step 2.2 : Method 2 : Pass &a[0][0][0], &a[1][0][0] to a function ``fun`` .. code-block:: c fun( &a[0][0][0] ); fun( &a[1][0][0] ); * Step 2.3 : Method 3 : Pass \*\*a, \*(\*(a + 1) + 0) to a function ``fun`` .. code-block:: c fun( **a ); fun( *(*(a + 1) + 0) ); * Step 3.1 : Define function ``fun`` .. code-block:: c void fun(int *ptr) { } * Step 4 : Note that it is call by Reference. Means contents of single dimension array can be changed inside function ``fun`` .. code-block:: c void fun(int *ptr) { ptr[0] = 66; ptr[1] = 77; ptr[2] = 88; ptr[3] = 99; } * See full program below .. code-block:: c #include void fun(int *ptr) { ptr[0] = 66; ptr[1] = 77; ptr[2] = 88; ptr[3] = 99; } int main(void) { int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; printf("----- Before call by reference -----\n"); for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 4; k++) { printf("a[%d][%d][%d] = %d\n", i, j, k, a[i][j][k]); } } } //Method 1 : Access Single dimension arrays fun( a[0][0] ); fun( a[1][0] ); //Method 2 : Access Single dimension arrays fun( &a[0][0][0] ); fun( &a[1][0][0] ); //Method 3 : Access Single dimension arrays fun( **a ); fun( *(*(a + 1) + 0) ); printf("----- After call by reference -----\n"); for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 4; k++) { printf("a[%d][%d][%d] = %d\n", i, j, k, a[i][j][k]); } } } return 0; } * Output is as below .. code-block:: c ----- Before call by reference ----- a[0][0][0] = 1 a[0][0][1] = 2 a[0][0][2] = 3 a[0][0][3] = 4 a[0][1][0] = 5 a[0][1][1] = 6 a[0][1][2] = 7 a[0][1][3] = 8 a[0][2][0] = 9 a[0][2][1] = 10 a[0][2][2] = 11 a[0][2][3] = 12 a[1][0][0] = 13 a[1][0][1] = 14 a[1][0][2] = 15 a[1][0][3] = 16 a[1][1][0] = 17 a[1][1][1] = 18 a[1][1][2] = 19 a[1][1][3] = 20 a[1][2][0] = 21 a[1][2][1] = 22 a[1][2][2] = 23 a[1][2][3] = 24 ----- After call by reference ----- a[0][0][0] = 66 a[0][0][1] = 77 a[0][0][2] = 88 a[0][0][3] = 99 a[0][1][0] = 5 a[0][1][1] = 6 a[0][1][2] = 7 a[0][1][3] = 8 a[0][2][0] = 9 a[0][2][1] = 10 a[0][2][2] = 11 a[0][2][3] = 12 a[1][0][0] = 66 a[1][0][1] = 77 a[1][0][2] = 88 a[1][0][3] = 99 a[1][1][0] = 17 a[1][1][1] = 18 a[1][1][2] = 19 a[1][1][3] = 20 a[1][2][0] = 21 a[1][2][1] = 22 a[1][2][2] = 23 a[1][2][3] = 24 .. _funcs_n_ptrs_int_td_array_ex_18: .. tab-set:: .. tab-item:: Example 4 : Call by Reference : Pass Address of Single dimension arrays which are part of a triple dimension array to a function * Step 1 : Consider a THREE dimensional array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow There are 6 single dimension arrays in ``int a[2][3][4]`` a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Address of single dimension arrays is simply &a[0][0] &a[0][1] &a[0][2] &a[1][0] &a[1][1] &a[1][2] * Step 2.1 : Method 1 : Pass address of single dimension arrays to a function ``fun`` .. code-block:: c fun( &a[0][0] ); fun( &a[1][0] ); * Step 2.2 : Method 2 : Pass address of single dimension arrays to a function ``fun`` .. code-block:: c fun( a[0] ); fun( a[1] ); * Step 2.3 : Method 2 : Pass address of single dimension arrays to a function ``fun`` .. code-block:: c fun( *a ); fun( *(a + 1) ); * Step 3.1 : Define the function ``fun`` .. code-block:: c void fun(int (*ptr)[4] ) { } * Step 3.2 : Define the function ``fun`` to change the contents of single dimension array integer by integer .. code-block:: c void fun(int (*ptr)[4] ) { (*ptr)[0] = 66; (*ptr)[1] = 77; (*ptr)[2] = 88; (*ptr)[3] = 99; } * See full program below .. code-block:: c #include void fun(int (*ptr)[4] ) { (*ptr)[0] = 66; (*ptr)[1] = 77; (*ptr)[2] = 88; (*ptr)[3] = 99; } int main(void) { int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; printf("----- Before call by reference -----\n"); for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 4; k++) { printf("a[%d][%d][%d] = %d\n", i, j, k, a[i][j][k]); } } } //Method 1 : Access Single dimension arrays fun( &a[0][0] ); fun( &a[1][0] ); //Method 2 : Access Single dimension arrays fun( a[0] ); fun( a[1] ); //Method 3 : Access Single dimension arrays fun( *a ); fun( *(a + 1) ); printf("----- After call by reference -----\n"); for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 4; k++) { printf("a[%d][%d][%d] = %d\n", i, j, k, a[i][j][k]); } } } return 0; } * Output is as below .. code-block:: c ----- Before call by reference ----- a[0][0][0] = 1 a[0][0][1] = 2 a[0][0][2] = 3 a[0][0][3] = 4 a[0][1][0] = 5 a[0][1][1] = 6 a[0][1][2] = 7 a[0][1][3] = 8 a[0][2][0] = 9 a[0][2][1] = 10 a[0][2][2] = 11 a[0][2][3] = 12 a[1][0][0] = 13 a[1][0][1] = 14 a[1][0][2] = 15 a[1][0][3] = 16 a[1][1][0] = 17 a[1][1][1] = 18 a[1][1][2] = 19 a[1][1][3] = 20 a[1][2][0] = 21 a[1][2][1] = 22 a[1][2][2] = 23 a[1][2][3] = 24 ----- After call by reference ----- a[0][0][0] = 66 a[0][0][1] = 77 a[0][0][2] = 88 a[0][0][3] = 99 a[0][1][0] = 5 a[0][1][1] = 6 a[0][1][2] = 7 a[0][1][3] = 8 a[0][2][0] = 9 a[0][2][1] = 10 a[0][2][2] = 11 a[0][2][3] = 12 a[1][0][0] = 66 a[1][0][1] = 77 a[1][0][2] = 88 a[1][0][3] = 99 a[1][1][0] = 17 a[1][1][1] = 18 a[1][1][2] = 19 a[1][1][3] = 20 a[1][2][0] = 21 a[1][2][1] = 22 a[1][2][2] = 23 a[1][2][3] = 24 .. _funcs_n_ptrs_int_td_array_ex_19: .. tab-set:: .. tab-item:: Example 5 : Call by Reference : Pass Double dimension arrays which are part of a Triple dimension array to a function * Step 1 : Consider a two dimensional array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; * Step 2 : Pass Double dimension array to function ``fun`` .. code-block:: c fun(a[1]); * Step 3.1 : Define function ``fun`` .. code-block:: c void fun(int (*ptr)[4]) { } * Step 3.3 : Access and Print integers inside function ``fun`` .. code-block:: c void fun(int (*ptr)[4]) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { printf("ptr[%d][%d] = %d\n", i, j, ptr[i][j] ); } printf("\n"); } } * Step 3.5 : Access and Change integers inside function ``fun`` .. code-block:: c void fun(int (*ptr)[4]) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { ptr[i][j] = 99; } } } * Step 4 : See the full program below .. code-block:: c #include void fun(int (*ptr)[4]) { // Access Integers and Change for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { ptr[i][j] = 99; } } } int main(void) { int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; printf("----- Before call by reference -----\n"); for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { printf("a[1][%d][%d] = %d\n", i, j, a[1][i][j] ); } printf("\n"); } fun(a[1]); printf("----- After call by reference -----\n"); for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { printf("a[1][%d][%d] = %d\n", i, j, a[1][i][j] ); } printf("\n"); } return 0; } * Step 5 : Output is as below .. code-block:: c ----- Before call by reference ----- a[1][0][0] = 13 a[1][0][1] = 14 a[1][0][2] = 15 a[1][0][3] = 16 a[1][1][0] = 17 a[1][1][1] = 18 a[1][1][2] = 19 a[1][1][3] = 20 a[1][2][0] = 21 a[1][2][1] = 22 a[1][2][2] = 23 a[1][2][3] = 24 ----- After call by reference ----- a[1][0][0] = 99 a[1][0][1] = 99 a[1][0][2] = 99 a[1][0][3] = 99 a[1][1][0] = 99 a[1][1][1] = 99 a[1][1][2] = 99 a[1][1][3] = 99 a[1][2][0] = 99 a[1][2][1] = 99 a[1][2][2] = 99 a[1][2][3] = 99 .. _funcs_n_ptrs_int_td_array_ex_20: .. tab-set:: .. tab-item:: Example 6 : Call by Reference : Pass address of Double dimension arrays which are part of a Triple dimension array to a function * Step 1 : Consider a two dimensional array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; * Step 2 : Pass Address of Double dimension array to function ``fun`` .. code-block:: c fun(&a[1]); * Step 3.1 : Define function ``fun`` .. code-block:: c void fun(int (*ptr)[3][4]) { } * Step 3.2 : Access and Print integers inside function ``fun`` .. code-block:: c void fun(int (*ptr)[3][4]) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { printf("%d ", (*ptr)[i][j]); } printf("\n"); } } * Step 3.5 : Access and Change integers inside function ``fun`` .. code-block:: c void fun(int (*ptr)[3][4]) { int data = 99; for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { (*ptr)[i][j] = data++; } } } * Step 4 : See the full program below .. code-block:: c #include void fun(int (*ptr)[3][4]) { int data = 99; for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { (*ptr)[i][j] = data++; } } } int main(void) { int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; printf("----- Before call by reference -----\n"); for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { printf("a[1][%d][%d] = %d\n", i, j, a[1][i][j] ); } printf("\n"); } fun(&a[1]); printf("----- After call by reference -----\n"); for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { printf("a[1][%d][%d] = %d\n", i, j, a[1][i][j] ); } printf("\n"); } return 0; } * Step 5 : Output is as below .. code-block:: c ----- Before call by reference ----- a[1][0][0] = 13 a[1][0][1] = 14 a[1][0][2] = 15 a[1][0][3] = 16 a[1][1][0] = 17 a[1][1][1] = 18 a[1][1][2] = 19 a[1][1][3] = 20 a[1][2][0] = 21 a[1][2][1] = 22 a[1][2][2] = 23 a[1][2][3] = 24 ----- After call by reference ----- a[1][0][0] = 99 a[1][0][1] = 100 a[1][0][2] = 101 a[1][0][3] = 102 a[1][1][0] = 103 a[1][1][1] = 104 a[1][1][2] = 105 a[1][1][3] = 106 a[1][2][0] = 107 a[1][2][1] = 108 a[1][2][2] = 109 a[1][2][3] = 110 .. _funcs_n_ptrs_int_td_array_ex_21: .. tab-set:: .. tab-item:: Example 7 : Call by Reference : Pass Address of Triple Dimension array to a function * Step 1 : Consider a two dimensional array .. code-block:: c int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; * Step 2 : Pass Address of Triple Dimension array to a function .. code-block:: c fun(&a); * Step 3.1 : Define function ``fun`` .. code-block:: c void fun(int (*ptr)[2][3][4] ) { } * Step 3.2 : Access and Print individual integers inside function ``fun`` .. code-block:: c for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) { for(int k = 0; k < 4; k++) { printf("(*ptr)[%d][%d][%d] = %d\n", i, j, k, (*ptr)[i][j][k]); } } } * Step 3.3 : Access and change individual integers inside function ``fun`` .. code-block:: c int data = 99; for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) { for(int k = 0; k < 4; k++) { (*ptr)[i][j][k] = data++; } } } * See full program below .. code-block:: c #include void fun(int (*ptr)[2][3][4]) { int data = 99; for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) { for(int k = 0; k < 4; k++) { (*ptr)[i][j][k] = data++; } } } } int main(void) { int a[2][3][4] = { { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, }, { {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}, } }; printf("----- Before call by reference -----\n"); for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) { for(int k = 0; k < 4; k++) { printf("a[%d][%d][%d] = %d\n", i, j, k, a[i][j][k]); } } } fun(&a); printf("----- After call by reference -----\n"); for(int i = 0; i < 2; i++) { for(int j = 0; j < 3; j++) { for(int k = 0; k < 4; k++) { printf("a[%d][%d][%d] = %d\n", i, j, k, a[i][j][k]); } } } return 0; } * Output is as below .. code-block:: c ----- Before call by reference ----- a[0][0][0] = 1 a[0][0][1] = 2 a[0][0][2] = 3 a[0][0][3] = 4 a[0][1][0] = 5 a[0][1][1] = 6 a[0][1][2] = 7 a[0][1][3] = 8 a[0][2][0] = 9 a[0][2][1] = 10 a[0][2][2] = 11 a[0][2][3] = 12 a[1][0][0] = 13 a[1][0][1] = 14 a[1][0][2] = 15 a[1][0][3] = 16 a[1][1][0] = 17 a[1][1][1] = 18 a[1][1][2] = 19 a[1][1][3] = 20 a[1][2][0] = 21 a[1][2][1] = 22 a[1][2][2] = 23 a[1][2][3] = 24 ----- After call by reference ----- a[0][0][0] = 99 a[0][0][1] = 100 a[0][0][2] = 101 a[0][0][3] = 102 a[0][1][0] = 103 a[0][1][1] = 104 a[0][1][2] = 105 a[0][1][3] = 106 a[0][2][0] = 107 a[0][2][1] = 108 a[0][2][2] = 109 a[0][2][3] = 110 a[1][0][0] = 111 a[1][0][1] = 112 a[1][0][2] = 113 a[1][0][3] = 114 a[1][1][0] = 115 a[1][1][1] = 116 a[1][1][2] = 117 a[1][1][3] = 118 a[1][2][0] = 119 a[1][2][1] = 120 a[1][2][2] = 121 a[1][2][3] = 122 .. card:: See Also * Other topics of integer and functions * :doc:`./int` * :doc:`./int_sd_array` * :doc:`./int_dd_array` * :doc:`./int_td_array` * :doc:`./int_sp` * :doc:`./int_dp` * :doc:`./int_tp` * Current Module * :doc:`../funcs_n_ptrs` * Previous Module * :doc:`../../typecasting_n_ptr/typecasting_n_ptr` * Next Module * :doc:`../../memcpy_ptr/memcpy_ptr` * Other Modules * :doc:`../../variable_and_ptr/variable_and_ptr` * :doc:`../../array_n_ptrs/array_n_ptrs` * :doc:`../../malloc_ptr/malloc_ptr` * :doc:`../../const_ptr/const_ptr` * :doc:`../../void_ptr/void_ptr` * :doc:`../../array_of_ptr/array_of_ptr` * :doc:`../../ptr_to_array/ptr_to_array` * :doc:`../../function_ptr/function_ptr` * :doc:`../../pre_incr_ptr/pre_incr_ptr` * :doc:`../../post_incr_ptr/post_incr_ptr` * :doc:`../../pre_decr_ptr/pre_decr_ptr` * :doc:`../../post_decr_ptr/post_decr_ptr`