CSDT BLOG

DISCOVER COLLECTIONS AND BLOGS THAT MATCH YOUR INTERESTS.




Share ⇓




What is structures in C Language?

Bookmark

What is structures in C Language?

In C programming, a struct (or structure) is a collection of variables (can be of different types) under a single name.

How to define structures?

Before you can create structure variables, you need to define its data type. To define a struct, the struct keyword is used.

Syntax of struct

struct structureName 

{

    dataType member1;

    dataType member2;

    ...

};

Here is an example:

struct Person

{

    char name[50];

    int citNo;

    float salary;

};

Here, a derived type struct Person is defined. Now, you can create variables of this type.

Create struct variables

When a struct type is declared, no storage or memory is allocated. To allocate memory of a given structure type and work with it, we need to create variables.

Here's how we create structure variables:

struct Person

{  char name[50];

    int citNo;

    float salary;

};

int main()

{

    struct Person person1, person2, p[20];

    return 0;

}

Another way of creating a struct variable is:

struct Person

{

    char name[50];

    int citNo;

    float salary;

} person1, person2, p[20];

In both cases, two variables person1person2, and an array variable p having 20 elements of type struct Person are created.

Access members of a structure

There are two types of operators used for accessing members of a structure.

  1. . - Member operator
  2. -> - Structure pointer operator (will be discussed in the next tutorial)

Suppose, you want to access the salary of person2. Here's how you can do it.

person2.salary

Example: Add two distances

// Program to add two distances (feet-inch)

#include <stdio.h>

struct Distance

{

    int feet;

    float inch;

} dist1, dist2, sum;


int main()

{

    printf("1st distance\n");

    printf("Enter feet: ");

    scanf("%d", &dist1.feet);

    printf("Enter inch: ");

    scanf("%f", &dist1.inch);

    printf("2nd distance\n");

    printf("Enter feet: ");

    scanf("%d", &dist2.feet);


    printf("Enter inch: ");

    scanf("%f", &dist2.inch);

    // adding feet

    sum.feet = dist1.feet + dist2.feet;

    // adding inches

    sum.inch = dist1.inch + dist2.inch;

    // changing to feet if inch is greater than 12

    while (sum.inch >= 12) 

    {

        ++sum.feet;

        sum.inch = sum.inch - 12;

    }

    printf("Sum of distances = %d\'-%.1f\"", sum.feet, sum.inch);

    return 0;

}

Output

1st distance

Enter feet: 12

Enter inch: 7.9

2nd distance

Enter feet: 2

Enter inch: 9.8

Sum of distances = 15'-5.7"

Keyword typedef: We use the typedef keyword to create an alias name for data types. It is commonly used with structures to simplify the syntax of declaring variables.

This code

struct Distance{

    int feet;

    float inch;

};

int main() {

    struct Distance d1, d2;

}

is equivalent to

typedef struct Distance{

    int feet;

    float inch;

} distances;

int main() {

    distances d1, d2;

}

Nested Structures: You can create structures within a structure in C programming. For example,

struct complex

{int imag;

 float real; };

struct number

{struct complex comp;

   int integers;

} num1, num2;

Suppose, you want to set imag of num2 variable to 11. Here's how you can do it:

num2.comp.imag = 11;

Why structs in C?

Suppose, you want to store information about a person: his/her name, citizenship number, and salary. You can create different variables namecitNo and salary to store this information.


What if you need to store information of more than one person? Now, you need to create different variables for each information per person: name1citNo1salary1name2citNo2salary2,etc.


A better approach would be to have a collection of all related information under a single name Person structure and use it for every person.



C Pointers to struct

Here's how you can create pointers to structs.

struct name {

    member1;

    member2;

    .

    .

};


int main()

{

    struct name *ptr, Harry;

}

Here, ptr is a pointer to struct.

Example: Access members using Pointer

To access members of a structure using pointers, we use the -> operator.

#include <stdio.h>

struct person

{

   int age;

   float weight;

};

int main()

{

    struct person *personPtr, person1;

    personPtr = &person1;   

    printf("Enter age: ");

    scanf("%d", &personPtr->age);

    printf("Enter weight: ");

    scanf("%f", &personPtr->weight);


    printf("Displaying:\n");

    printf("Age: %d\n", personPtr->age);

    printf("weight: %f", personPtr->weight);

    return 0;

}

In this example, the address of person1 is stored in the personPtr pointer using personPtr = &person1;.

Now, you can access the members of person1 using the personPtr pointer.

By the way,

  • personPtr->age is equivalent to (*personPtr).age
  • personPtr->weight is equivalent to (*personPtr).weight

Dynamic memory allocation of structs

Sometimes, the number of struct variables you declared may be insufficient. You may need to allocate memory during run-time. Here's how you can achieve this in C programming.

Example: Dynamic memory allocation of structs

#include <stdio.h>

#include <stdlib.h>

struct person {

   int age;

   float weight;

   char name[30];

};

int main()

{

   struct person *ptr;

   int i, n;


   printf("Enter the number of persons: ");

   scanf("%d", &n);

   // allocating memory for n numbers of struct person

   ptr = (struct person*) malloc(n * sizeof(struct person));

   for(i = 0; i < n; ++i)

   {

       printf("Enter first name and age respectively: ");

       // To access members of 1st struct person,

       // ptr->name and ptr->age is used

       // To access members of 2nd struct person,

       // (ptr+1)->name and (ptr+1)->age is used

       scanf("%s %d", (ptr+i)->name, &(ptr+i)->age);

   }

   printf("Displaying Information:\n");

   for(i = 0; i < n; ++i)

       printf("Name: %s\tAge: %d\n", (ptr+i)->name, (ptr+i)->age);

   return 0;

}

When you run the program, the output will be:

Enter the number of persons:  2

Enter first name and age respectively:  Harry 24

Enter first name and age respectively:  Gary 32

Displaying Information:

Name: HarryAge: 24

Name: GaryAge: 32

In the above example, n number of struct variables are created where n is entered by the user.

To allocate the memory for n number of struct person, we used,

ptr = (struct person*) malloc(n * sizeof(struct person));


Then, we used the ptr pointer to access elements of person.


C Structure and Function

Similar to variables of built-in types, you can also pass structure variables to a function.

Passing structs to functions

#include <stdio.h>

struct student {

   char name[50];

   int age;

};

// function prototype

void display(struct student s);

int main() 

{

   struct student s1;

   printf("Enter name: ");

   // read string input from the user until \n is entered

   // \n is discarded

   scanf("%[^\n]%*c", s1.name);

   printf("Enter age: ");

   scanf("%d", &s1.age);

   display(s1); // passing struct as an argument

   return 0;

}

void display(struct student s) {

   printf("\nDisplaying information\n");

   printf("Name: %s", s.name);

   printf("\nAge: %d", s.age);

}

Output

Enter name: Bond

Enter age: 13


Displaying information

Name: Bond

Age: 13  

Here, a struct variable s1 of type struct student is created. The variable is passed to the display() function using display(s1); statement.

Return struct from a function

Here's how you can return structure from a function:

#include <stdio.h>

struct student

{

    char name[50];

    int age;

};

// function prototype

struct student getInformation();

int main()

{

    struct student s;

    s = getInformation();

    printf("\nDisplaying information\n");

    printf("Name: %s", s.name);

    printf("\nRoll: %d", s.age);

        return 0;

}

struct student getInformation() 

{

  struct student s1;

  printf("Enter name: ");

  scanf ("%[^\n]%*c", s1.name);

  printf("Enter age: ");

  scanf("%d", &s1.age);

  

  return s1;

}

Here, the getInformation() function is called using s = getInformation(); statement. The function returns a structure of type struct student. The returned structure is displayed from the main() function.


Notice that, the return type of getInformation() is also struct student.


Passing struct by reference

You can also pass structs by reference (in a similar way like you pass variables of built-in type by reference). 


During pass by reference, the memory addresses of struct variables are passed to the function.

#include <stdio.h>

typedef struct Complex

{

    float real;

    float imag;

} complex;

void addNumbers(complex c1, complex c2, complex *result); 

int main()

{

    complex c1, c2, result;

    printf("For first number,\n");

    printf("Enter real part: ");

    scanf("%f", &c1.real);

    printf("Enter imaginary part: ");

    scanf("%f", &c1.imag);


    printf("For second number, \n");

    printf("Enter real part: ");

    scanf("%f", &c2.real);

    printf("Enter imaginary part: ");

    scanf("%f", &c2.imag);

    addNumbers(c1, c2, &result); 

    printf("\nresult.real = %.1f\n", result.real);

    printf("result.imag = %.1f", result.imag);

        return 0;

}

void addNumbers(complex c1, complex c2, complex *result) 

{

     result->real = c1.real + c2.real;

     result->imag = c1.imag + c2.imag; 

}

Output

For first number,

Enter real part:  1.1

Enter imaginary part:  -2.4

For second number, 

Enter real part:  3.4

Enter imaginary part:  -3.2


result.real = 4.5

result.imag = -5.6  


In the above program, three structure variables c1c2 and the address of result is passed to the addNumbers() function. Here, result is passed by reference.

When the result variable inside the addNumbers() is altered, the result variable inside the main() function is also altered accordingly.


1

Our Recent Coment