C Multidimensional Arrays

What are Multidimensional Arrays?

A multidimensional array in C is an array of arrays. The most common is the 2D array (matrix), but C supports 3D, 4D, or even higher dimensions.

Declaration Syntax

data_type array_name[size1][size2]...[sizeN];
// Examples
int matrix[3][4];      // 2D: 3 rows, 4 columns
float cube[2][3][4];   // 3D: 2 layers, 3 rows, 4 columns

2D Arrays (Most Common)

Declaration and Initialization

#include <stdio.h>
int main() {
// Method 1: Declare then assign
int matrix1[2][3];
matrix1[0][0] = 1;
matrix1[0][1] = 2;
matrix1[0][2] = 3;
matrix1[1][0] = 4;
matrix1[1][1] = 5;
matrix1[1][2] = 6;
// Method 2: Initialize at declaration
int matrix2[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
// Method 3: Row-by-row (braces optional)
int matrix3[2][3] = {1, 2, 3, 4, 5, 6};
// Method 4: Partial initialization (rest become 0)
int matrix4[2][3] = {
{1, 2},
{4}
};
// Result: {{1,2,0}, {4,0,0}}
return 0;
}

Accessing Elements

#include <stdio.h>
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// Access individual element
printf("Element at [1][2]: %d\n", matrix[1][2]);  // 7
// Change value
matrix[0][0] = 99;
printf("Modified: %d\n", matrix[0][0]);  // 99
return 0;
}

Traversing 2D Arrays (Nested Loops)

#include <stdio.h>
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// Print all elements row by row
for(int i = 0; i < 3; i++) {        // Rows
for(int j = 0; j < 4; j++) {    // Columns
printf("%3d ", matrix[i][j]);
}
printf("\n");  // New line after each row
}
return 0;
}

Output:

  1   2   3   4
5   6   7   8
9  10  11  12

Practical Example 1: Matrix Addition

#include <stdio.h>
int main() {
int A[2][3] = {{1, 2, 3}, {4, 5, 6}};
int B[2][3] = {{7, 8, 9}, {10, 11, 12}};
int C[2][3];  // Result matrix
// Add matrices
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 3; j++) {
C[i][j] = A[i][j] + B[i][j];
}
}
// Display result
printf("Result of A + B:\n");
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 3; j++) {
printf("%3d ", C[i][j]);
}
printf("\n");
}
return 0;
}

Output:

Result of A + B:
8  10  12
14  16  18

Practical Example 2: Matrix Multiplication

#include <stdio.h>
int main() {
int A[2][3] = {{1, 2, 3}, {4, 5, 6}};
int B[3][2] = {{7, 8}, {9, 10}, {11, 12}};
int C[2][2] = {{0, 0}, {0, 0}};  // Result: 2x2
// Matrix multiplication
for(int i = 0; i < 2; i++) {        // Rows of A
for(int j = 0; j < 2; j++) {    // Columns of B
for(int k = 0; k < 3; k++) { // Columns of A / Rows of B
C[i][j] += A[i][k] * B[k][j];
}
}
}
// Display result
printf("A (2x3) * B (3x2) = C (2x2):\n");
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
printf("%4d ", C[i][j]);
}
printf("\n");
}
return 0;
}

Output:

A (2x3) * B (3x2) = C (2x2):
58   64
139  154

3D Arrays

#include <stdio.h>
int main() {
// 3D array: 2 layers, 3 rows, 4 columns
int cube[2][3][4] = {
{ // Layer 0
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
},
{ // Layer 1
{13, 14, 15, 16},
{17, 18, 19, 20},
{21, 22, 23, 24}
}
};
// Access element
printf("Element [1][2][3]: %d\n", cube[1][2][3]);  // 24
// Traverse 3D array
for(int i = 0; i < 2; i++) {        // Layers
printf("Layer %d:\n", i);
for(int j = 0; j < 3; j++) {    // Rows
for(int k = 0; k < 4; k++) { // Columns
printf("%3d ", cube[i][j][k]);
}
printf("\n");
}
printf("\n");
}
return 0;
}

Output:

Layer 0:
1   2   3   4
5   6   7   8
9  10  11  12
Layer 1:
13  14  15  16
17  18  19  20
21  22  23  24

Omitting Size in Function Parameters

When passing multidimensional arrays to functions, you must specify all dimensions except the first:

#include <stdio.h>
// CORRECT: First dimension can be omitted
void printMatrix(int rows, int cols, int matrix[][3]) {
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
printf("%3d ", matrix[i][j]);
}
printf("\n");
}
}
// Also correct using pointer notation
void printMatrix2(int rows, int cols, int (*matrix)[3]) {
for(int i = 0; i < rows; i++) {
for(int j = 0; j < cols; j++) {
printf("%3d ", matrix[i][j]);
}
printf("\n");
}
}
// WRONG: Cannot omit both dimensions
// void wrong(int matrix[][]) { }  // ERROR!
int main() {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
printMatrix(2, 3, matrix);
return 0;
}

Practice Problem: Student Grades

#include <stdio.h>
int main() {
// 3 students, 4 subjects
int grades[3][4] = {
{85, 90, 78, 88},   // Student 0
{92, 88, 95, 89},   // Student 1
{76, 84, 91, 87}    // Student 2
};
// Calculate average for each student
for(int student = 0; student < 3; student++) {
int sum = 0;
for(int subject = 0; subject < 4; subject++) {
sum += grades[student][subject];
}
float avg = sum / 4.0;
printf("Student %d average: %.2f\n", student + 1, avg);
}
// Calculate average for each subject
for(int subject = 0; subject < 4; subject++) {
int sum = 0;
for(int student = 0; student < 3; student++) {
sum += grades[student][subject];
}
float avg = sum / 3.0;
printf("Subject %d average: %.2f\n", subject + 1, avg);
}
return 0;
}

Output:

Student 1 average: 85.25
Student 2 average: 91.00
Student 3 average: 84.50
Subject 1 average: 84.33
Subject 2 average: 87.33
Subject 3 average: 88.00
Subject 4 average: 88.00

Memory Layout (Row-Major Order)

C stores multidimensional arrays in row-major order (row by row in memory):

#include <stdio.h>
int main() {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
// Memory addresses are contiguous
printf("Address of arr[0][0]: %p\n", &arr[0][0]);
printf("Address of arr[0][1]: %p\n", &arr[0][1]);
printf("Address of arr[0][2]: %p\n", &arr[0][2]);
printf("Address of arr[1][0]: %p\n", &arr[1][0]);
// In memory: [1][2][3][4][5][6] sequentially
// Row 0 elements stored first, then row 1
return 0;
}

Quick Reference Table

DimensionDeclarationAccessLoop Nesting
1Dint arr[5]arr[i]1 loop
2Dint arr[3][4]arr[i][j]2 loops
3Dint arr[2][3][4]arr[i][j][k]3 loops
4Dint arr[2][3][4][5]arr[i][j][k][l]4 loops

Common Operations Summary

// Declare a 3x4 matrix
int matrix[3][4];
// Initialize all to zero
int zero[3][4] = {0};
// Get total elements
int total = 3 * 4;  // Use rows * cols
// Copy matrix
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++)
dest[i][j] = src[i][j];
// Find max element
int max = matrix[0][0];
for(int i = 0; i < rows; i++)
for(int j = 0; j < cols; j++)
if(matrix[i][j] > max) max = matrix[i][j];

Key Points to Remember

  1. Row-major order - Rows stored contiguously in memory
  2. Index starts at 0 - First element is [0][0]
  3. Size must be known except the first dimension in functions
  4. Use nested loops for traversal
  5. Memory allocation is static (size fixed at compile time)
  6. Partial initialization sets remaining elements to 0

Complete Guide to Core & Advanced C Programming Concepts (Functions, Strings, Arrays, Loops, I/O, Control Flow)

https://macronepal.com/bash/building-blocks-of-c-a-complete-guide-to-functions/
Explains how functions in C work as reusable blocks of code, including declaration, definition, parameters, return values, and modular programming structure.

https://macronepal.com/bash/the-heart-of-text-processing-a-complete-guide-to-strings-in-c-2/
Explains how strings are handled in C using character arrays, string manipulation techniques, and common library functions for text processing.

https://macronepal.com/bash/the-cornerstone-of-data-organization-a-complete-guide-to-arrays-in-c/
Explains arrays in C as structured memory storage for multiple values, including indexing, initialization, and efficient data organization.

https://macronepal.com/bash/guaranteed-execution-a-complete-guide-to-the-do-while-loop-in-c/
Explains the do-while loop in C, where the loop body executes at least once before checking the condition.

https://macronepal.com/bash/mastering-iteration-a-complete-guide-to-the-for-loop-in-c/
Explains the for loop in C, including initialization, condition checking, and increment/decrement for controlled iteration.

https://macronepal.com/bash/mastering-iteration-a-complete-guide-to-while-loops-in-c/
Explains the while loop in C, focusing on condition-based repetition and proper loop control mechanisms.

https://macronepal.com/bash/beyond-if-else-a-complete-guide-to-switch-case-in-c/
Explains switch-case statements in C, enabling multi-branch decision-making based on variable values.

https://macronepal.com/bash/mastering-conditional-logic-a-complete-guide-to-if-else-statements-in-c/
Explains if-else statements in C for decision-making and controlling program flow based on conditions.

https://macronepal.com/bash/mastering-the-fundamentals-a-complete-guide-to-arithmetic-operations-in-c/
Explains arithmetic operations in C such as addition, subtraction, multiplication, division, and operator precedence.

https://macronepal.com/bash/foundation-of-c-programming-a-complete-guide-to-basic-input-output/
Explains basic input and output in C using scanf and printf for interacting with users and displaying results.

Online C Code Compiler
https://macronepal.com/free-online-c-code-compiler-2/

Leave a Reply

Your email address will not be published. Required fields are marked *


Macro Nepal Helper