Basics of Character Double Dimension Array

In this section, you are going to learn

What are the basic properties of a character double dimension array ?

What are the different expressions of double dimension array ?

What are synonymous expresions of double dimension array ?

How to find sizeof() of expressions of double dimension array ?

char array_name[Row][Column];

Consider a character double dimension array

char a[3][4];

Let us answer few basic questions in this array

How many characters can be stored in this array ?

How many bytes are there in this array ?

What is the sizeof the array ?

How many single dimension arrays are present in this double dimension array ?

What are the names of single dimension arrays in this double dimension array ?

How do you represent the first character ?

How do you represent the last character ?

How do you initialise the array at the time of declaration ?

Let us now explore basic examples of double dimension array !

  • Step 1 : Define a Double Dimension Array

char a[3][4] = { "lap", "top", "123" };
  • Step 2 : Access and Print individual characters

for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4 - 1 ; j++) {
                printf("%c", a[i][j]);
        }
        printf("\n");
}
  • Step 3 : Access and Print individual strings

for (int i = 0; i < 3; i++) {
        printf("%s", a[i]);
        printf("\n");
}
  • Step 4 : See the full program below

#include <stdio.h>

int main(void)
{
        char a[3][4] = { "lap", "top", "123" };

        // print individual characters
        printf("--------- Access and Print Characters ----------\n");
        for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 4 - 1 ; j++) {
                        printf("%c", a[i][j]);
                }
                printf("\n");
        }

        // print individual strings
        printf("--------- Access and Print Strings ----------\n");
        for (int i = 0; i < 3; i++) {
                printf("%s", a[i]);
                printf("\n");
        }

        return 0;
}
  • Step 5 : Output is as below

--------- Access and Print Characters ----------
lap
top
123
--------- Access and Print Strings ----------
lap
top
123
  • Step 1 : Define a Double Dimension Array

char a[3][4] = {
        {'l', 'a', 'p', '\0'},
        {'t', 'o', 'p', '\0'},
        {'1', '2', '3', '\0'},
};
  • Step 2 : Access and Print individual characters

for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4 - 1 ; j++) {
                printf("%c", a[i][j]);
        }
        printf("\n");
}
  • Step 3 : Access and Print individual strings

for (int i = 0; i < 3; i++) {
        printf("%s", a[i]);
        printf("\n");
}
  • Step 4 : See the full program below

#include <stdio.h>

int main(void)
{
        char a[3][4] = {
                {'l', 'a', 'p', '\0'},
                {'t', 'o', 'p', '\0'},
                {'1', '2', '3', '\0'},
        };

        // print individual characters
        printf("--------- Access and Print Characters ----------\n");
        for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 4 - 1 ; j++) {
                        printf("%c", a[i][j]);
                }
                printf("\n");
        }

        // print individual strings
        printf("--------- Access and Print Strings ----------\n");
        for (int i = 0; i < 3; i++) {
                printf("%s", a[i]);
                printf("\n");
        }

        return 0;
}
  • Step 5 : Output is as below

--------- Access and Print Characters ----------
lap
top
123
--------- Access and Print Strings ----------
lap
top
123

Let us now explore double dimension array in depth !

Below are the properties

  • Expressions

  • Synonyms

  • typeof(expression)

  • sizeof(expression)

  • fun(expression)

Know what are the possible expressions and how to properly call them !

Expression

Description

a[0][0]

  • a[0][0] is a character

a[1][0]

  • a[1][0] is a character

a[2][0]

  • a[2][0] is a character

&a[0][0]

  • &a[0][0] is address of a character

&a[1][0]

  • &a[1][0] is address of a character

&a[2][0]

  • &a[2][0] is address of a character

**a

  • **a is character. Same as a[0][0]

*(*(a + 1) + 0)

  • *(*(a + 1) + 0) is a character. Same as a[1][0]

*(*(a + 2) + 0)

  • *(*(a + 2) + 0) is a character. Same as a[2][0]

a[0]

  • a[0] is a single dimension array

a[1]

  • a[1] is a single dimension array

a[2]

  • a[2] is a single dimension array

&a[0]

  • &a[0] is address of a single dimension array

&a[1]

  • &a[1] is address of a single dimension array

&a[2]

  • &a[2] is address of a single dimension array

*a

  • *a is a single dimension array

*(a + 1)

  • *(a + 1) is a single dimension array

*(a + 2)

  • *(a + 2) is a single dimension array

a

  • a is address of a single dimension array

a + 1

  • a + 1 is address of a single dimension array

a + 2

  • a + 2 is address of a single dimension array

&a

  • &a is the address of double dimension array

Synonyms : Which can be used interchangeably !

Programmatically few expressions are one and the same ! Let us learn them

Expression

Synonyms

a[0][0]

**a

a[1][0]

*(*(a + 1) + 0)

a[2][0]

*(*(a + 2) + 0)

&a[0][0]

a[0]

&a[1][0]

a[1]

&a[2][0]

a[2]

**a

a[0][0]

*(*(a + 1) + 0)

a[1][0]

*(*(a + 2) + 0)

a[2][0]

a[0]

*a

&a[0][0]

a[1]

*(a + 1)

&a[1][0]

a[2]

*(a + 2)

&a[2][0]

&a[0]

a + 0

a

&a[1]

a + 1

&a[2]

a + 2

*a

a[0]

&a[0][0]

*(a + 1)

a[1]

&a[1][0]

*(a + 2)

a[2]

&a[2][0]

a

&a[0]

a + 1

&a[1]

a + 2

&a[2]

&a

&a

Finding the type of an expression is easy. See below

Expression

Type

Description

a[0][0]

char

  • a[0][0] is a character

a[1][0]

char

  • a[1][0] is a character

a[2][0]

char

  • a[2][0] is a character

&a[0][0]

char *

  • &a[0][0] is address of a character

&a[1][0]

char *

  • &a[1][0] is address of a character

&a[2][0]

char *

  • &a[2][0] is address of a character

**a

char

  • **a is character. Same as a[0][0]

*(*(a + 1) + 0)

char

  • *(*(a + 1) + 0) is a character. Same as a[1][0]

*(*(a + 2) + 0)

char

  • *(*(a + 2) + 0) is a character. Same as a[2][0]

a[0]

char *

  • a[0] is a single dimension character array

  • Hence type is char *

a[1]

char *

  • a[1] is a single dimension character array

  • Hence type is char *

a[2]

char *

  • a[2] is a single dimension character array

  • Hence type is char *

&a[0]

char *

  • a[0] is a single dimension character array

  • Hence typeof(&a[0]) is char (* )[4]

&a[1]

char *

  • a[1] is a single dimension character array

  • Hence typeof(&a[1]) is char (* )[4]

&a[2]

char *

  • a[2] is a single dimension character array

  • Hence typeof(&a[2]) is char (* )[4]

*a

char

  • *a is a single dimension character array

  • Hence type is char *

*(a + 1)

char

  • *(a + 1) is a single dimension character array

  • Hence type is char *

*(a + 2)

char

  • *(a + 2) is a single dimension character array

  • Hence type is char *

a

char *

  • a is equal to &a[0]

  • Hence typeof(a) is char (* )[4]

a + 1

char *

  • a + 1 is equal to &a[1]

  • Hence typeof(a + 1) is char (* )[4]

a + 2

char *

  • a + 2 is equal to &a[2]

  • Hence typeof(a + 2) is char (* )[4]

&a

char (*)[3][4]

  • &a is address of complete array

sizeof(expression)

size

Description

sizeof(a[0][0])

1

a[0][0] is a character

sizeof(a[1][0])

1

a[1][0] is a character

sizeof(a[2][0])

1

a[2][0] is a character

sizeof(&a[0][0])

8

&a[0][0] is address / pointer

sizeof(&a[1][0])

8

&a[1][0] is address / pointer

sizeof(&a[2][0])

8

&a[2][0] is address / pointer

sizeof(**a)

1

**a is a character

sizeof(*(*(a + 1) + 0))

1

*(*(a + 1) + 0) is a character

sizeof(*(*(a + 2) + 0))

1

*(*(a + 2) + 0) is a character

sizeof(a[0])

4

a[0] is a single dimension array

sizeof(a[1])

4

a[1] is a single dimension array

sizeof(a[2])

4

a[2] is a single dimension array

sizeof(&a[0])

8

&a[0] is address / pointer

sizeof(&a[1])

8

&a[1] is address / pointer

sizeof(&a[2])

8

&a[2] is address / pointer

sizeof(*a)

4

*a is a single dimension array

sizeof(*(a + 1))

4

*(a + 1) is a single dimension array

sizeof(*(a + 2))

4

*(a + 2) is a single dimension array

sizeof(a)

12

a is a double dimension array

sizeof(a + 1)

8

a + 1 is address / pointer

sizeof(a + 2)

8

a + 2 is address / pointer

sizeof(&a)

8

&a is address / pointer

  • See the full program below

#include <stdio.h>

int main(void)
{
        char a[3][4] = { "lap", "top", "123" };

        printf("sizeof(a[0][0])         = %d\n", (int) sizeof(a[0][0]) );
        printf("sizeof(a[1][0])         = %d\n", (int) sizeof(a[1][0]) );
        printf("sizeof(a[2][0])         = %d\n", (int) sizeof(a[2][0]) );
        printf("sizeof(&a[0][0])        = %d\n", (int) sizeof(&a[0][0]) );
        printf("sizeof(&a[1][0])        = %d\n", (int) sizeof(&a[1][1]) );
        printf("sizeof(&a[2][0])        = %d\n", (int) sizeof(&a[2][0]) );
        printf("sizeof(**a)             = %d\n", (int) sizeof(**a));
        printf("sizeof(*(*(a + 1) + 0)) = %d\n", (int) sizeof(*(*(a + 1) + 0)) );
        printf("sizeof(*(*(a + 2) + 0)) = %d\n", (int) sizeof(*(*(a + 2) + 0)) );
        printf("sizeof(a[0])            = %d\n", (int) sizeof(a[0]) );
        printf("sizeof(a[1])            = %d\n", (int) sizeof(a[1]) );
        printf("sizeof(a[2])            = %d\n", (int) sizeof(a[2]) );
        printf("sizeof(&a[0])           = %d\n", (int) sizeof(&a[0]) );
        printf("sizeof(&a[1])           = %d\n", (int) sizeof(&a[1]) );
        printf("sizeof(&a[2])           = %d\n", (int) sizeof(&a[2]) );
        printf("sizeof(*a)              = %d\n", (int) sizeof(*a) );
        printf("sizeof(*(a + 1))        = %d\n", (int) sizeof(*(a + 1)) );
        printf("sizeof(*(a + 2))        = %d\n", (int) sizeof(*(a + 2)) );
        printf("sizeof(a)               = %d\n", (int) sizeof(a) );
        printf("sizeof(a + 1)           = %d\n", (int) sizeof(a + 1) );
        printf("sizeof(a + 2)           = %d\n", (int) sizeof(a + 2) );
        printf("sizeof(&a)              = %d\n", (int) sizeof(&a) );

        return 0;
}
  • Output is as below on 64 bit OS

sizeof(a[0][0])         = 1
sizeof(a[1][0])         = 1
sizeof(a[2][0])         = 1
sizeof(&a[0][0])        = 8
sizeof(&a[1][0])        = 8
sizeof(&a[2][0])        = 8
sizeof(**a)             = 1
sizeof(*(*(a + 1) + 0)) = 1
sizeof(*(*(a + 2) + 0)) = 1
sizeof(a[0])            = 4
sizeof(a[1])            = 4
sizeof(a[2])            = 4
sizeof(&a[0])           = 8
sizeof(&a[1])           = 8
sizeof(&a[2])           = 8
sizeof(*a)              = 4
sizeof(*(a + 1))        = 4
sizeof(*(a + 2))        = 4
sizeof(a)               = 12
sizeof(a + 1)           = 8
sizeof(a + 2)           = 8
sizeof(&a)              = 8

If fun(x) is the function call, then fun(typeof(x)) is the prototype / definition

Function Call

Function Definition

Observations

fun(a[0][0])

void fun(char x) {}

  • Call by Value

fun(a[1][0])

void fun(char x) {}

  • Call by Value

fun(a[2][0])

void fun(char x) {}

  • Call by Value

fun(&a[0][0])

void fun(char *p) { }

  • Call by Reference

fun(&a[1][0])

void fun(char *p) { }

  • Call by Reference

fun(&a[2][0])

void fun(char *p) { }

  • Call by Reference

fun(**a)

void fun(char x) {}

  • Call by Value

fun(*(*(a + 1) + 0))

void fun(char x) {}

  • Call by Value

fun(*(*(a + 2) + 0))

void fun(char x) {}

  • Call by Value

fun(a[0])

void fun(char *p) { }

  • Call by Reference

fun(a[1])

void fun(char *p) { }

  • Call by Reference

fun(a[2])

void fun(char *p) { }

  • Call by Reference

fun(&a[0])

void fun(char (*p)[4]) { }

  • Call by Reference

fun(&a[1])

void fun(char (*p)[4]) { }

  • Call by Reference

fun(&a[2])

void fun(char (*p)[4]) { }

  • Call by Reference

fun(*a)

void fun(char *p) { }

  • Call by Reference

fun(*(a + 1))

void fun(char *p) { }

  • Call by Reference

fun(*(a + 2))

void fun(char *p) { }

  • Call by Reference

fun(a)

void fun(char (*p)[4]) { }

  • Call by Reference

fun(a + 1)

void fun(char (*p)[4]) { }

  • Call by Reference

fun(a + 2)

void fun(char (*p)[4]) { }

  • Call by Reference

fun(&a)

void fun(char (*p)[3][4]) { }

  • Call by Reference

Read more about function calls and conventions of Functions and Character Double Dimension Array