# Passing 2-D Array to a Function in C

Last updated on July 27, 2020

Just like a 1-D array, when a 2-D array is passed to a function, the changes made by function effect the original array. But before we study this, I want to make a few points clear.

We have learned that in chapter Two Dimensional Array in C that when a 2-D is passed to a function it is optional to specify the size of the left most dimensions. So if we have an array of 2 rows and 3 dimensions then it can be passed to a function in the following two ways:

 1 2 3 4 int two_d[2][3] = { {99,44,11}, {4,66,9} }; 

1st way:

 1 2 3 4 void function(int a[][3]) { // statements; } 

2nd way:

 1 2 3 4 void function(int a[2][3]) { // statements; } 

Recall that 2-D arrays are stored in row-major order i.e first row 0 is stored, then next to it row 1 is stored and so on. Therefore in C, a 2-D array is actually a 1-D array in which each element is itself a 1-D array. Since the name of the array points to the 0th element of the array. In the case of a 2-D array, 0th element is an array. Therefore, from this discussion, we can conclude that two_d is a pointer to an array of 3 integers.

Hence we can also declare a function where the formal argument is of type pointer to an array.

3rd way:

 1 2 3 4 void function(int (*a)[3]) { // statements; } 

Essentially in all the three cases discussed the type of the variable a is a pointer to an array of 3 integers, they differ only in the way they are represented.

Okay let's get back to our original discussion - Why the changes made by the function effect the original array? The following program answers this question.

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 #include void change_twod(int (*a)[3]); int main() { int i,j, two_d[2][3] = { {99,44,11}, {4,66,9} }; printf("Original array: \n\n"); for(i = 0; i < 2; i++) { for(j = 0; j < 3; j++) { printf("%3d ", two_d[i][j]); } printf("\n"); } change_twod(two_d); printf("\n\nModified array : \n\n"); for(i = 0; i < 2; i++) { for(j = 0; j < 3; j++) { printf("%3d ", two_d[i][j]); } printf("\n"); } // signal to operating system everything works fine return 0; } void change_twod(int (*arr)[3]) { int i, j; printf("\n\nIncrementing every element by 5\n"); // increment original elements by 6 for(i = 0; i < 2; i++) { for(j = 0; j < 3; j++) { arr[i][j] = arr[i][j] + 5; } } } 

Expected Output:

 1 2 3 4 5 6 7 8 9 Original array: 99 44 11 4 66 9 Incrementing every element by 5 Modified array : 104 49 16 9 71 14 

How it works:

As discussed earlier in this section that two_d and arr are of type pointer to an array of 3 integers. In line 25, change_twod() is called with an actual argument of two_d which is then assigned to arr. Now both two_d and arr points to the same 2-D array, as a result, changes made inside the function will be visible in the function main().