mikkel250

Posted on

# Structures and arrays in C

#### Overview

As covered in the previous post, structures are very useful for logically grouping related elements together. This can be further extended by combining them with arrays. Since structures are a type, it is perfectly valid in C to create an array of structures. So, if you had to keep track of many dates (to continue with the previous examples), an array could be created to hold all of them in one place.

##### Declaring an array of structures

To declare an array of structures, the syntax is similar to declaring as any other array, but preceded by the struct keyword and structure type:

``````// declares an array of ten items of structure type date
struct date myDates[10];
``````

To access or assign elements inside the array, use the index and the dot notation:

``````myDates[1].month = 7;
myDates[1].day = 9;
myDates[1].year = 1979;
``````

Initializing of arrays containing structures is similar to initializing multidimensional arrays. The internal curly brackets below are optional, but they make the code much more readable, so are recommended:

``````//assigns the first 3 dates in an array of 6
struct date myDates[6] =
{
{7, 9, 1979},
{11, 26, 2019},
{12, 26, 2019},
};

// to initialize values besides the one declared in the initial initialization, the curly brackets can be used inside the declaration
struct date myDates[3] =
{
[4] = {1, 1, 2020}
};

// ...and dot notation can be used to assign specific elements as well
struct date myDates[3] = {[1].month = 12, [1].day =30};
``````
##### Structures that contain arrays

It is also possible to define structures that contain arrays as members. The most common use case of this is to have strings inside a structure, e.g. creating a structure named 'month' that contains both the number of days and the abbreviation for the name of the month:

``````struct month
{
int numberOfDays;
char name[3];
}

struct month aMonth;
aMonth.numberOfDays = 31;
aMonth.name[0] = 'J';
aMonth.name[1] = 'a';
aMonth.name[2] = 'n';

// a quicker way to do the above, for the name, though slightly less readable, would be to use the following notation
struct month aMonth = {31, {'J', 'a', 'n'}};
``````