- C Programming Tutorial
- C - Home
- C - Overview
- C - Features
- C - History
- C - Environment Setup
- C - Program Structure
- C - Hello World
- C - Compilation Process
- C - Comments
- C - Tokens
- C - Keywords
- C - Identifiers
- C - User Input
- C - Basic Syntax
- C - Data Types
- C - Variables
- C - Integer Promotions
- C - Type Conversion
- C - Booleans
- C - Constants
- C - Literals
- C - Escape sequences
- C - Format Specifiers
- C - Storage Classes
- C - Operators
- C - Arithmetic Operators
- C - Relational Operators
- C - Logical Operators
- C - Bitwise Operators
- C - Assignment Operators
- C - Unary Operators
- C - Increment and Decrement Operators
- C - Ternary Operator
- C - sizeof Operator
- C - Operator Precedence
- C - Misc Operators
- C - Decision Making
- C - if statement
- C - if...else statement
- C - nested if statements
- C - switch statement
- C - nested switch statements
- C - Loops
- C - While loop
- C - For loop
- C - Do...while loop
- C - Nested loop
- C - Infinite loop
- C - Break Statement
- C - Continue Statement
- C - goto Statement
- C - Functions
- C - Main Functions
- C - Function call by Value
- C - Function call by reference
- C - Nested Functions
- C - Variadic Functions
- C - User-Defined Functions
- C - Callback Function
- C - Return Statement
- C - Recursion
- C - Scope Rules
- C - Static Variables
- C - Global Variables
- C - Arrays
- C - Properties of Array
- C - Multi-Dimensional Arrays
- C - Passing Arrays to Function
- C - Return Array from Function
- C - Variable Length Arrays
- C - Pointers
- C - Pointers and Arrays
- C - Applications of Pointers
- C - Pointer Arithmetics
- C - Array of Pointers
- C - Pointer to Pointer
- C - Passing Pointers to Functions
- C - Return Pointer from Functions
- C - Function Pointers
- C - Pointer to an Array
- C - Pointers to Structures
- C - Chain of Pointers
- C - Pointer vs Array
- C - Character Pointers and Functions
- C - NULL Pointer
- C - void Pointer
- C - Dangling Pointers
- C - Dereference Pointer
- C - Near, Far and Huge Pointers
- C - Initialization of Pointer Arrays
- C - Pointers vs. Multi-dimensional Arrays
- C - Strings
- C - Array of Strings
- C - Special Characters
- C - Structures
- C - Structures and Functions
- C - Arrays of Structures
- C - Self-Referential Structures
- C - Nested Structures
- C - Unions
- C - Bit Fields
- C - Typedef
- C - Input & Output
- C - File I/O
- C - Preprocessors
- C - Header Files
- C - Type Casting
- C - Error Handling
- C - Variable Arguments
- C - Memory Management
- C - Command Line Arguments
- C Programming Resources
- C - Questions & Answers
- C - Quick Guide
- C - Useful Resources
- C - Discussion
C - Nested Structures
In the programming context, the term “nesting” refers to enclosing a particular programming element inside the similar element. For example, nested loops and nested conditional statements, etc. In this chapter, we shall learn about nested structures. When one of the elements in the definition of a struct type is of another struct type, the we call it as nested structure in C.
Nested structures are defined when one of the elements of a struct type is itself a composite representation of one or more types.
A general syntax of nested structure is as follows −
struct struct1{ type var1; type var2; struct struct2 strvar; }
We can think of nested structures in the following situation.
If we want to define a struct type representing a student with name and age as its elements, and other element is the course that is characterized by the course ID, the title, and the credit points. Here, the student structure has an inner course structure.
struct student{ char *name; int age; struct course c1; };
The student variable will be stored in the memory as follows −
Name | Age | Course | ||
---|---|---|---|---|
kiran | 25 | 001 | C Programming | 6 |
The nesting of structures can be performed by two methods −
- Defining inline structure
- Including the element of a structure already defined
Let us learn these methods by suitable examples.
Method 1
In this method, we shall define an employee data type, with one of its elements being date of birth. C doesn’t have a built−in date type. We shall declare the dob struct with three int types d, m and y inside the employee structure and its variable d1 is one of the elements of the outer type.
Example
#include <stdio.h> #include <string.h> struct employee{ char name[10]; float salary; struct dob{ int d, m, y; } d1; }; int main(){ struct employee e1 = {"Kiran", 25000, {12, 5, 1990}}; printf("Name: %s\n", e1.name); printf("Salary: %f\n", e1.salary); printf("Date of Birth: %d-%d-%d\n", e1.d1.d, e1.d1.m, e1.d1.y); return 0; }
Output
Name: Kiran Salary: 25000.000000 Date of Birth: 12-5-1990
You can see that the variable of employee type is initialized with its date element having another pair of curly brackets.
Method 2
The other approach for using nested structures is to define the inner struct type first, and then use its variable as one of the elements in the outer struct type, which is defined afterwards.
Here, the dob type is defined in the beginning, it has three int elements − d, m and y. The employee struct type is defined afterwards. Since dob is already defined, we can have an element of its type inside employee.
Example
#include <stdio.h> #include <string.h> struct dob{ int d, m, y; }; struct employee{ char name[10]; float salary; struct dob d1; }; int main(){ struct employee e1 = {"Kiran", 25000, {12, 5, 1990}}; printf("Name: %s\n", e1.name); printf("Salary: %f\n", e1.salary); printf("Date of Birth: %d-%d-%d\n", e1.d1.d, e1.d1.m, e1.d1.y); return 0; }
Output
Name: Kiran Salary: 25000.000000 Date of Birth: 12-5-1990
Note that the inner struct type should be defined before the outer type. We can also declare a variable of dob type and then include it in the initialization of employee type variable, as shown below −
struct dob d1 = {12, 5, 1990}; struct employee e1 = {"Kiran", 25000, d1};
Example
In the following code, the nesting of structure goes upto two levels. In other words, the outer struct type employee has one element that is a variable of experience struct type. In turn, the experience structure has two elements of another struct type called date.
Hence, the memory allocation for employee variable can be understood with the following illustration −
Name | Salary | Designation | from | to | ||||
kiran | 25000 | Clerk | 12 | 5 | 1990 | 31 | 3 | 2021 |
Here is the complete code −
Example
#include <stdio.h> #include <string.h> struct date{ int d, m, y; }; struct experience{ char designation[10]; struct date from; struct date to; }; struct employee{ char name[10]; float salary; struct experience exp; }; int main(){ struct date d1 = {12, 5, 1990}; struct date d2 = {31, 3, 2021}; struct experience exp = {"Clerk", d1, d2}; struct employee e1 = {"Kiran", 25000, exp}; printf("Name: %s\n", e1.name); printf("Salary: %f\n", e1.salary); printf("Experience: Designation: %s\n", e1.exp.designation); printf("From : %d-%d-%d\n", e1.exp.from.d,e1.exp.from.m, e1.exp.from.y ); printf("To : %d-%d-%d\n", e1.exp.to.d, e1.exp.to.m, e1.exp.to.y ); return 0; }
Output
Name: Kiran Salary: 25000.000000 Experience: Designation: Clerk From : 12-5-1990 To : 31-3-2021
Pointer to nested structure
We know that the address of a struct variable can be stored in a pointer variable. Further, C uses the indirection operator -> to access the elements of a variable that is referenced by the pointer. In case of the nested structure, the elements of the inner struct elements are accessed by ptr->inner_struct_var.element;
In the example below, we have declared a pointer ptr to an employee struct variable. the date, month and year elements of inner dob struct variable are accessed as ptr->d1.d, ptr->d1.m and ptr->d1.y expressions.
Example
#include <stdio.h> #include <string.h> struct employee{ char name[10]; float salary; struct dob{ int d, m, y; } d1; }; int main(){ struct employee e1 = {"Kiran", 25000, {12, 5, 1990}}; struct employee *ptr = &e1; printf("Name: %s\n", ptr->name); printf("Salary: %f\n", ptr->salary); printf("Date of Birth: %d-%d-%d\n", ptr->d1.d, ptr->d1.m, ptr->d1.y); return 0; }
Output
Name: Kiran Salary: 25000.000000 Date of Birth: 12-5-1990
To Continue Learning Please Login
Login with Google