Types of Array in C

In the vast realm of programming languages, C stands tall as a foundation stone. Its simplicity and power have made it a timeless favorite among developers. And at the heart of C’s magic lies one of its fundamental building blocks – Arrays.

Arrays are the workhorses of C, serving as repositories for data and offering a canvas for creativity. Understanding arrays is not just a rite of passage for every aspiring programmer but a key to unlocking the true potential of the language.

In this blog, we will embark on a journey to explore various types of arrays in C, revealing their intricacies, applications, and utilities.

As we dive into this fascinating world, you’ll gain insights into single-dimensional arrays, multi-dimensional arrays, dynamic arrays, character arrays, arrays of pointers, arrays of structures, and much more.

But before we dive deeper, we recommend you read our What is an Array? blog to understand the essential building blocks of C and how arrays drive powerful programming solutions.

Single-Dimensional Arrays (1-D)

Definition:

In the programming world, arrays are a means of organizing and storing data. A single-dimensional array, often called a 1-D array, is the simplest form of an array. It can be considered a collection of variables of the same data type, all referenced under a common name.

Declaration:

In C, declaring a 1-D array involves specifying the data type of its elements followed by the array’s name and the number of elements it can hold. For example, to declare an array of integers capable of holding 5 elements, you would use the following syntax:

int myArray[5];

This declaration tells the compiler to allocate memory for 5 integers, making them accessible through the name ‘myArray’.

Initialization:

After declaring an array, you can initialize it by assigning values to its individual elements. There are several ways to initialize a 1-D array in C:

  1. Initializing at Declaration:
int myArray[5] = {1, 2, 3, 4, 5};

This initializes ‘myArray’ with the values 1, 2, 3, 4, and 5.

  1. Initializing without Specifying Size:

If you omit the size during declaration, the compiler will infer it from the number of values provided:

int myArray[] = {1, 2, 3, 4, 5};

Here, ‘myArray’ is still a 1-D array capable of holding 5 integers.

  1. Initializing Partially:

You can also initialize only a portion of the array, leaving the rest to be initialized later:

int myArray[5] = {0}; // Initializes all elements to 0

Accessing Elements:

Accessing elements in a 1-D array is done using the array’s name followed by the index of the element you wish to access. In C, arrays are zero-indexed, meaning the first element is at index 0, the second at index 1, and so on.

int value = myArray[2]; // Accesses the third element (index 2) and assigns it to 'value'

Real-world Applications of 1-D Arrays:

1-D arrays find extensive use in various real-world applications, including but not limited to:

  • Lists and Sequences: Storing a list of names, numbers, or any type of data that needs to be organized sequentially.
  • Counting and Accumulation: Keeping track of counts, scores, or incremental values.
  • Data Retrieval: Accessing elements of a database or dataset.
  • Mathematical Operations: Performing mathematical calculations using arrays.
  • Text Processing: Storing and processing text or characters.

Understanding 1-D arrays is a crucial stepping stone for every programmer, as they form the basis for more complex data structures and algorithms.

Multi-Dimensional Arrays

Arrays are not limited to just one dimension in C; they can extend into multiple dimensions, creating what are known as multi-dimensional arrays. These arrays provide a structured way to store and manipulate data, especially when dealing with complex datasets or grids.

Definition and Declaration:

In essence, a multi-dimensional array is an array of arrays. You can think of it as a grid or table with rows and columns, where each cell holds a value. To declare a multi-dimensional array, you specify the data type of its elements, the array’s name, and the dimensions it has.

int myArray[3][4]; // Declares a 2-D array with 3 rows and 4 columns

This declaration allocates memory for 3 rows and 4 columns of integers.

Two-Dimensional (2-D) Arrays:

2-D arrays are the most common type of multi-dimensional arrays. They often represent tables, matrices, or grids in real-world applications. Initializing and accessing elements in a 2-D array differs slightly from 1-D arrays.

  • Initialization:

You can initialize a 2-D array as follows:

int matrix[2][3] = {

    {1, 2, 3},

    {4, 5, 6}

};

Here, ‘matrix’ is a 2-D array with 2 rows and 3 columns, initialized with values.

  • Accessing Elements:

Accessing elements in a 2-D array involves specifying both the row and column indices:

int value = matrix[1][2]; // Accesses the element in the second row and third column

Three-Dimensional (3-D) Arrays:

While 2-D arrays are common, C also supports 3-D arrays, which can be visualized as cubes or boxes containing data. They have three dimensions: rows, columns, and depth.

  • Declaration:
int cube[2][3][4]; // Declares a 3-D array with 2 layers, 3 rows, and 4 columns

Initializing and accessing elements in a 3-D array follow a similar pattern to 2-D arrays.

  • Initialization:
int cube[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}

    }

};
  • Accessing Elements:

Accessing elements in a 3-D array requires specifying all three indices:

int value = cube[1][2][3]; // Accesses the element in the second layer, third row, and fourth column

Real-world Applications of 2-D and 3-D Arrays:

  • Image Processing: Storing and manipulating pixel values in images.
  • Game Development: Representing game boards, maps, and 3D environments.
  • Scientific Computing: Storing and processing data from experiments and simulations.
  • Matrices in Mathematics: Solving linear equations, transformations, and more.
  • Databases: Organizing data in tabular form.

Understanding multi-dimensional arrays is vital for handling structured data efficiently.

Dynamic Arrays

While fixed-size arrays are valuable, they come with limitations. Dynamic arrays, on the other hand, offer the flexibility to resize and manage memory dynamically during program execution. In C, dynamic arrays are typically implemented using pointers and the ‘malloc()’ and ‘realloc()’ functions.

Understanding Memory Allocation:

Dynamic arrays, also known as dynamic memory allocation, allow you to allocate memory for an array at runtime rather than during compilation. This feature is particularly useful when you don’t know the array’s size in advance or need to adapt to changing data requirements.

  • Declaration:

To create a dynamic array in C, you declare a pointer to the data type you want the array to hold. Initially, this pointer doesn’t point to any memory location.

int* dynamicArray;

Creation and Management of Dynamic Arrays:

Dynamic arrays are created using functions like ‘malloc()’ and can be resized using ‘realloc()’. Here’s how you can create and manage dynamic arrays:

  • Allocation using malloc():

To allocate memory for a dynamic array, you use the ‘malloc()’ function, which reserves a block of memory and returns a pointer to it. You specify the size (in bytes) you need.

int size = 5; // Number of elements

int* dynamicArray = (int*)malloc(size * sizeof(int));
  • Resizing using realloc():

If you need to resize a dynamic array, use the ‘realloc()’ function. It takes the current pointer and the new size and returns a pointer to the resized memory block.

int newSize = 10; // New number of elements

dynamicArray = (int*)realloc(dynamicArray, newSize * sizeof(int));

Benefits:

  • Flexibility: Dynamic arrays can adapt to changing data requirements.
  • Efficient Memory Usage: Memory is allocated as needed, preventing wastage.
  • Scalability: Suitable for applications dealing with large or variable-sized datasets.

Drawbacks:

  • Complexity: Managing dynamic arrays requires careful memory allocation and deallocation.
  • Risk of Memory Leaks: Forgetting to free memory with ‘free()’ can lead to memory leaks.
  • Slightly Slower: Dynamic arrays may be marginally slower than fixed-size arrays due to memory management overhead.

Dynamic arrays are a powerful tool in C programming, offering the ability to handle data with greater flexibility. However, they come with responsibilities, such as proper memory management to avoid memory leaks.

Character Arrays

Character arrays, often called strings, play a pivotal role in C programming for handling textual data. In C, strings are represented as arrays of characters, where each character is a single element in the array.

Declaration:

In C, character arrays are declared by specifying the data type ‘char’ followed by the array’s name and size. For example, to declare a character array capable of holding a word with up to 20 characters:

char word[20];

Initialization:

Character arrays can be initialized in multiple ways:

  • At Declaration:
char greeting[] = "Hello, World!";

Here, the size is automatically determined based on the length of the string.

  • Character-wise Initialization:
char name[5];

name[0] = 'J';

name[1] = 'o';

name[2] = 'h';

name[3] = 'n';

name[4] = '\0'; // Null-terminate the string to mark its end

This manually assigns characters to each element of the array, with the last element being the null character ‘\0’ to denote the end of the string.

Working with Strings in C:

C provides a rich set of string manipulation functions in the standard library (e.g., <string.h>) to perform operations on character arrays. Some common string operations include:

  • String Length: Determining the length of a string using strlen().
  • Concatenation: Joining two strings using strcat().
  • Copying: Copying one string to another using strcpy().
  • Comparison: Comparing two strings using strcmp().

Here’s an example of concatenating two strings:

#include <stdio.h>

#include <string.h>

int main() {

    char greeting[20] = "Hello, ";

    char name[] = "John";

    strcat(greeting, name); // Concatenate 'name' to 'greeting'

    printf("Final Greeting: %s\n", greeting);

    return 0;

}

Common Operations on Character Arrays:

Character arrays are used extensively in C for:

  • Input and Output: Reading and writing text from and to files or the console.
  • Tokenization: Splitting a string into tokens based on delimiters.
  • Searching and Replacing: Finding and replacing substrings within a string.
  • String Manipulation: Modifying strings, converting cases, or formatting.

Understanding character arrays is essential for anyone working with textual data in C.

Arrays of Pointers and Arrays of Structures

In C, you can take the concept of arrays a step further by creating arrays of pointers or arrays of structures. These advanced data structures offer greater flexibility and are especially useful for managing complex data.

Arrays of Pointers:

An array of pointers is an array where each element is a pointer to another data type. This allows you to create arrays of strings, arrays of structures, or arrays of any data type.

  • Declaration:

To declare an array of pointers, specify the data type followed by an asterisk (*) for the pointer and the array’s name.

int* intArray[5]; // Array of pointers to integers
  • Initialization:

You can initialize an array of pointers by assigning addresses of variables or dynamically allocated memory.

int a = 1, b = 2, c = 3;

int* intArray[] = {&a, &b, &c};

This creates an array of pointers to integers, each pointing to the respective variables.

Arrays of Structures:

Arrays of structures allow you to create collections of structured data, where each element of the array is a structure containing multiple fields.

  • Declaration:

To declare an array of structures, define the structure type and specify the array’s name and size.

struct Point {

    int x;

    int y;

};

struct Point pointArray[3]; // Array of structures

  • Initialization:

You can initialize an array of structures by specifying values for each field.

struct Point pointArray[] = {{1, 2}, {3, 4}, {5, 6}};

This initializes an array of ‘Point’ structures with coordinates.

Common Use Cases:

  • Arrays of Pointers:
    • Managing arrays of strings or character arrays.
    • Creating arrays of function pointers for dynamic dispatch.
    • Storing pointers to dynamically allocated memory.
  • Arrays of Structures:
    • Representing collections of objects with multiple attributes.
    • Storing records from databases or data retrieved from files.
    • Creating complex data structures like linked lists or trees.

Arrays of pointers and arrays of structures are powerful tools in C for handling complex data structures efficiently. They allow you to build versatile data representations that can be used in various applications.

Array Operations

Arrays in C provide a rich set of operations for manipulating data efficiently. Understanding these operations is crucial for effective programming. Let’s explore some common array operations:

Common Array Operations:

  1. Insertion:

Inserting elements into an array involves placing a new value at a specific position while shifting existing elements if necessary. For example, to insert an element at index 2:

int arr[5] = {1, 2, 3, 4, 5};

int value = 6;

int index = 2;

// Shift elements to make space for the new element

for (int i = 4; i >= index; i--) {

    arr[i + 1] = arr[i];

}

// Insert the new element

arr[index] = value;
  1. Deletion:

Removing elements from an array entails shifting elements to fill the gap left by the deleted element. For example, to delete the element at index 2:

int arr[5] = {1, 2, 3, 4, 5};

int index = 2;

// Shift elements to fill the gap left by the deleted element

for (int i = index; i < 4; i++) {

    arr[i] = arr[i + 1];

}
  1. Searching:

Searching an array involves finding the index or presence of a specific element. Common search algorithms include linear search and binary search (for sorted arrays).

int arr[5] = {1, 2, 3, 4, 5};

int target = 3;

int found = 0;

for (int i = 0; i < 5; i++) {

    if (arr[i] == target) {

        found = 1;

        break;

    }

}

if (found) {

    // Element found

} else {

    // Element not found

}
  1. Sorting:

Sorting an array arranges its elements in ascending or descending order. Common sorting algorithms include bubble sort, insertion sort, and quicksort.

int arr[5] = {5, 2, 1, 4, 3};

// Using the bubble sort algorithm for ascending order

for (int i = 0; i < 4; i++) {

    for (int j = 0; j < 4 - i; j++) {

        if (arr[j] > arr[j + 1]) {

            // Swap elements if they are in the wrong order

            int temp = arr[j];

            arr[j] = arr[j + 1];

            arr[j + 1] = temp;

        }

    }

}

Performance Implications:

The choice of array operation and algorithm can significantly impact program performance. For example, sorting a large array using a slow sorting algorithm can be time-consuming. Understanding the trade-offs between different operations and algorithms is essential for writing efficient code.

Insights into C Library Functions for Array Manipulation

C offers a robust set of library functions in the standard library to simplify array manipulation tasks. These functions are part of header files like <stdio.h> and <string.h>.

Let’s explore some essential library functions and their usage in array manipulation:

  1. <stdio.h> Functions:
  • printf() is used to print array elements to the console.
  • scanf() is used to read array elements from the console.

Example:

int arr[5];

printf("Enter 5 integers: ");

for (int i = 0; i < 5; i++) {

    scanf("%d", &arr[i]);

}

printf("Array elements: ");

for (int i = 0; i < 5; i++) {

    printf("%d ", arr[i]);

}
  1. <string.h> Functions:
  1. strlen() calculates the length of a string (number of characters excluding the null character).

Example:

#include <string.h>

char str[] = "Hello, World!";

int length = strlen(str); // 'length' will be 13
  1. strcpy() copies one string to another.
  2. strncpy() copies a specified number of characters from one string to another.

Example:

#include <string.h>

char source[] = "Hello";

char destination[10];

strcpy(destination, source); // Copies 'Hello' to 'destination'
  1. strcat() appends one string to another.
  2. strncat() appends a specified number of characters from one string to another.

Example:

#include <string.h>

char str1[20] = "Hello, ";

char str2[] = "World!";

strcat(str1, str2); // Appends 'World!' to 'str1'
  1. strcmp() compares two strings and returns 0 if they are equal.

Example:

#include <string.h>

char str1[] = "Hello";

char str2[] = "World";

int result = strcmp(str1, str2); // 'result' will be non-zero since 'str1' and 'str2' are not equal

These are just a few examples of library functions that simplify array manipulation in C. Leveraging these functions can save time and effort when working with arrays, strings, and other data structures.

Summing up

In the world of C programming, arrays stand as essential tools for data organization and manipulation. Throughout this exploration, we’ve uncovered the diverse types of arrays and operations that C offers to programmers. As you continue your journey in C programming, mastering arrays and their operations will be a cornerstone of your skill set. Remember that practical experience and experimentation are vital to becoming proficient in using arrays to their full potential.

This blog has only scratched the surface of what you can achieve with arrays in C. To further your knowledge, consider exploring more advanced topics such as dynamic arrays of structures, multidimensional arrays of pointers, and custom array manipulation functions. The world of C programming is vast and filled with opportunities for innovation and problem-solving.

→ Explore this Curated Program for You ←

Deepika BK
DEEPIKA, SEO Analyst at Great Learning, plans and constantly writes on cutting-edge technologies like Data Science, Artificial Intelligence, Software Engineering, Cloud Computing, and Cyber Security. She has in-hand skills in Cryptography, Block-Chain Technology, Data Engineering, NeuroScience, and programming languages such as C, C#, and Java. She is a perpetual learner and has a hunger to explore new technologies, enhance her writing skills, and guide others.

Full Stack Software Development Course from UT Austin

Learn full-stack development and build modern web applications through hands-on projects. Earn a certificate from UT Austin to enhance your career in tech.

4.8 ★ Ratings

Course Duration : 28 Weeks

Cloud Computing PG Program by Great Lakes

Enroll in India's top-rated Cloud Program for comprehensive learning. Earn a prestigious certificate and become proficient in 120+ cloud services. Access live mentorship and dedicated career support.

4.62 ★ (2,760 Ratings)

Course Duration : 8 months

Scroll to Top