DEV Community

Cover image for Structure In C - Fundamentals
Srijan
Srijan

Posted on

Structure In C - Fundamentals

📸 by Robby McCullough on Unsplash

We have variables of different data types such as ints, chars, floats, etc to store data. We have arrays to group together a collection of data of the same data type.

But in reality, we will not always have the luxury of having data of one type. That's where a structure comes into the picture.


Topics-

0. Definition and Declaration
1. Initialization and Accessing the Members of a Structure
2. Operating with Structure Variable
3. Array Of Structure
4. Nested Structure


0. Definition and Declaration

A structure is a collection of one or more variables, possibly of different types, grouped under a single name. It is a user-defined data type. They help to organize complicated data in large programs, as they allow a group of logically related variables to be treated as one.

For example, a student can have properties name, age, gender and marks. We could create a character array for name, an integer variable for roll, a character variable for gender and an integer array for marks. But if there are 20 or 100 students, it will be difficult to handle those variables.

We can declare a structure using struct keyword following the syntax as below:

struct structureName
        {
            dataType memberVariable1;
            datatype memberVariable2;
            ...
        };

 /* Example */
struct student
    {
        char name[20];
        int roll;
        char gender;
        int marks[5];
    };

The above statement defines a new data type struct student. Each variable of this data type will consist of name[20], roll, gender and marks[5]. These are known as members of the structure.

Once a structure is declared as a new data type, then the variables of that data type can be created.


 /* Variable declaration */
struct structureName structureVariable;

 /* Example /*
struct student stu1;
struct student stu2,stu3,stu4;

Each variable of struct student has its copies of the members.

Few important nuggets-

  1. The members of the structure do not occupy memory until a structure variable is created.

  2. You might have noticed we are using struct while variable declaration as well. Isn't that tedious?

Using the typedef keyword in the structure declaration we can prevent writing struct again.

typedef struct students
    {
        char name[20];
        int roll;
        char gender;
        int marks[5];
    } STUDENT; 

/* or */
typedef struct
    {
        char name[20];
        int roll;
        char gender;
        int marks[5];
    } STUDENT; 


STUDENT stu1,stu2,stu3,stu4;

By convention, uppercase letters are used for type definitions ( such as STUDENT).

3.The structure definition and variable declaration can be combined as below.

struct student
    {
        char name[20];
        int roll;
        chat gender;
        int marks[5];
    }stu1, stu2, stu3, stu4;

4.The use of structureName is optional. The code below is completely valid.

struct
    {
        char name[20];
        int roll;
        char gender;
        int marks[5];
    }stu1, stu2, stu3, stu4;

5.Structures are generally declared at the top of the source code file, even before defining functions.

6.C doesn't allow variable initialization inside a structure declaration.

1. Initialization and Accessing the Members of a Structure

Like any other variable, a structure variable can also be initialized where they are declared. There is a one-to-one relationship between the members and their initializing values.

 /* Variable Initialization */
struct structureName = { value1, value2,...};

 /* Example */
typedef struct
    {
        char name[20];
        int roll;
        char gender;
        int marks[5];
    }STUDENT;

void main(){
STUDENT stu1 = { "Alex", 43, 'M', {76, 78, 56, 98, 92}};
STUDENT stu2 = { "Max", 33, 'M', {87, 84, 82, 96, 78}};
}

To access the members, we have to use . ( dot operator).

 /* Accessing Memebers of a Structure */
structureVariable.memberVariable

/* Example */
 printf("Name: %s\n", stu1.name);
 printf("Roll: %d\n", stu1.roll);
 printf("Gender: %c\n", stu1.gender);
 for( int i = 0; i < 5; i++)
   printf("Marks in %dth subject: %d\n", i, stu1.marks[i]);

/* Output */
Name: Alex
Roll: 43
Gender: M
Marks in 0th subject: 76
Marks in 1th subject: 78
Marks in 2th subject: 56
Marks in 3th subject: 98
Marks in 4th subject: 92

The members can be initialized in the variable declaration in any order using ..

STUDENT stu3 = { .gender = 'M', .roll = 23, .name = "Gasly", .marks = { 99, 45, 67, 78, 94}};

We can also initialize the first few members and leave the remaining blank. However, the uninitialized members should be only at the end of the list.

Uninitialized integers and floating-point numbers have a default value 0. It is \0( NULL) for characters and strings.

STUDENT stu4 = { "Kviyat", 65};
 /* same as { "Kviyat", 65, '\0', { 0, 0, 0, 0, 0} } */

2. Operating with Structure Variable

Like variables of primitive data types, we cannot perform arithmetic operations such as +, -, *, /, etc. Likewise, relational and equality operators cannot be used with structure variables. But, we can copy one structure variable to another, provided they belong to the same structure.

 /* Invalid Operations */
stu1 + stu2
stu1 - stu2
stu1 == stu2
stu1 != stu2 etc.

 /* Valid Operation */
stu1 = stu2

We will have to compare the structure members individually to compare structure variables.

#include <stdio.h>
#include <string.h>

 struct student
    {
        char name[20];
        double roll;
        char gender;
        int marks[5];
    }stu1,stu2;


void main()
{
    struct student stu1= { "Alex", 43, 'M', {76, 78, 56, 98, 92}};
    struct student stu2 = { "Max", 33, 'M', {87, 84, 82, 96, 78}};

    if( strcmp(stu1.name,stu2.name) == 0 && stu1.roll == stu2.roll)
        printf("Both are the records of the same student.\n");
    else printf("Different records, different students.\n");

     /* Copiying the structure variable */
    st2 = st1;

    if( strcmp(stu1.name,stu2.name) == 0 && stu1.roll == stu2.roll)
        printf("\nBoth are the records of the same student.\n");
    else printf("\nDifferent records, different students.\n");
}

 /* Output */
Different records, different students.

Both are the records of the same student.

3. Array of Structure

You have already seen how we had to create 4 different struct student type variables to store the records of 4 students. A better way would be to create an array of struct student ( just like array of ints).

struct student
    {
        char name[20];
        double roll;
        char gender;
        int marks[5];
    };

struct student stu[4];

To access the elements of the array stu and the members of each element, loops can be used.

 /* Taking values for the user */

for(int i = 0; i < 4; i++)
    {
        printf("Enter name:\n");
        scanf("%s",&stu[i].name);
        printf("Enter roll:\n");
        scanf("%d",&stu[i].roll);
        printf("Enter gender:\n");
        scanf(" %c",&stu[i].gender);

        for( int j = 0; j < 5; j++)
        {
            printf("Enter marks of %dth subject:\n",j);
            scanf("%d",&stu[i].marks[j]);
        }

        printf("\n-------------------\n\n");
    }

 /* Finding the average marks and printing it */

for(int i = 0; i < 4; i++)
    {
        float sum = 0;
        for( int j = 0; j < 5; j++)
        {
            sum += stu[i].marks[j];
        }

        printf("Name: %s\nAverage Marks = %.2f\n\n", stu[i].name,sum/5);
    }

4. Nested Structure

Nesting of structure means having one or more structure variables inside another structure. Like we declare an int member or char member, we can also declare a structure variable as a member.

struct date
    {
       int date;
       int month;
       int year;
    };

struct student
    {
        char name[20];
        int roll;
        char gender;
        int marks[5];
        struct birth birthday;
    };

void main(){
 struct student stu1;

The structure variable birthday of type struct birth is nested inside struct student. It is quite apparent you cannot nest a structure variable of type struct student inside struct student.

Note that the structure to be nested has to be declared first. Using ., we can access the members contained within the inner structure as well as other members.

 /* Example */
stu1.birthday.date
stu1.birthday.month
stu1.birthday.year
stu1.name

Structure variables of different types can be nested as well.

struct birth
    {
       int date;
       int month;
       int year;
    };

struct relation
    {
        char fathersName[20];
        char mothersName[20];
    };

struct student
    {
        char name[20];
        int roll;
        char gender;
        int marks[5];
        struct birth birthday;
        struct relation parents; 
    };

In the second one, we will discuss the memory allocation of structure and their relationship with pointers and functions.

Top comments (1)

Collapse
 
pentacular profile image
pentacular

By convention, uppercase letters are used for type definitions ( such as STUDENT).

This is not a standard C convention.

In C upper case identifiers are conventionally used by macro definitions.

\0( NULL)

Please note that '\0' is not the same as NULL.

NULL is the null pointer constant which is a constant expression evaluating to 0 or (void *)0.