- 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 - Structures and Functions
In C, struct is a derived data type. Just as we can pass arguments of primary data types, a variable of struct data type can also be passed to a function. You can also pass structures using call by value as well as call by reference methods. A function in C may also return a struct data type.
In this chapter, we shall learn to −
- Pass elements of struct type
- Pass struct variable
- Return struct from function
- Return struct pointer
Pass struct elements
A derived type is a combination of one or more elements of any of the primary types as well as the same or different derived type. It is possible to pass elements to a function, either by value or by reference.
In the following example, a derived type called rectangle with two elements. A struct variable r with has the elements r.len and l.brd, and they are passed to a function. The area() function then computes the area of rectangle.
Example
#include <stdio.h> #include <string.h> struct rectangle{ float len, brd; }; int area(float, float); int main () { struct rectangle r; printf("Input length and breadth of a rectangle\n"); //scanf("%f %f", &r.len, &r.brd); r.len=10.50; r.brd=20.5; area(r.len, r.brd); return 0; } int area(float a, float b){ double area = (double)(a*b); printf("Length: %f \n Breadth: %f \n Area: %lf\n", a, b, area); return 0; }
Output
Input length and breadth of a rectangle Length: 10.500000 Breadth: 20.500000 Area: 215.250000
Pass struct variable
Let us modify the above example, to pass the struct variable itself (instead of its elements) to the area() function. The rectangle struct type also has an additional element called area. Inside the function, the elements of the struct variable are accessed though the dot operator, and the area is calculated.
Example
#include <stdio.h> #include <string.h> struct rectangle{ float len, brd; double area; }; int area(struct rectangle); int main () { struct rectangle r; printf("Input length and breadth of a rectangle\n"); //scanf("%f %f", &r.len, &r.brd); r.len=10.50; r.brd=20.5; area(r); return 0; } int area(struct rectangle r){ r.area = (double)(r.len*r.brd); printf("Length: %f \n Breadth: %f \n Area: %lf\n", r.len, r.brd, r.area); return 0; }
Output
Input length and breadth of a rectangle Length: 10.500000 Breadth: 20.500000 Area: 215.250000
Return struct from function
We know that a function in C is able to return a value of any of the types. In this example, the area() function is defined to return a struct variable.
In main(), inputs are accepted from the user for length and breadth, and are passed to the function. Inside the function, the area is computed, and a struct variable is populated and returned to the main() function, where its elements are displayed.
Example
#include <stdio.h> #include <string.h> struct rectangle{ float len, brd; double area; }; struct rectangle area(float x, float y); int main () { struct rectangle r; float x, y; printf("Input length and breadth of a rectangle\n"); //scanf("%f %f", &x, &y); x=10.5; y=20.5; r=area(x, y); printf("Length: %f \n Breadth: %f \n Area: %lf\n", r.len, r.brd, r.area); return 0; } struct rectangle area(float x, float y){ double area = (double)(x*y); struct rectangle r = {x, y, area}; return r; }
Output
Input length and breadth of a rectangle Length: 10.500000 Breadth: 20.500000 Area: 215.250000
Pass struct by reference
In C, a function may be defined to have its arguments passed by value or reference. A reference is the pointer to an existing variable. In the example explained below, a struct variable of rectangle type is declared in main() and its address is passed to a user−defined function − area(). When called, the area() function is able to use the elements of the variable with the indirection operator −>. It computes the result and assigns it to the area element r−>area.
Example
#include <stdio.h> #include <string.h> struct rectangle{ float len, brd; double area; }; int area(struct rectangle *); int main () { struct rectangle r; printf("Input length and breadth of a rectangle\n"); //scanf("%f %f", &r.len, &r.brd); r.len=10.50; r.brd=20.5; area(&r); return 0; } int area(struct rectangle *r){ r->area = (double)(r->len*r->brd); printf("Length: %f \n Breadth: %f \n Area: %lf\n", r->len, r->brd, r->area); return 0; }
Output
Input length and breadth of a rectangle Length: 10.500000 Breadth: 20.500000 Area: 215.250000
Return struct pointer
Let us rewrite the above code to define the area() function and return a pointer to a struct rectangle data type. The area() function has two call by value arguments. The main() function reads the length and breadth from the user and passes them to the area() function, which populates a struct variable and passes its reference back to main().
Example
#include <stdio.h> #include <string.h> struct rectangle{ float len, brd; double area; }; struct rectangle * area(float x, float y); int main (){ struct rectangle *r; float x, y; printf("Input length and breadth of a rectangle\n"); //scanf("%f %f", &x, &y); x=10.5; y=20.5; r=area(x, y); printf("Length: %f \n Breadth: %f \n Area: %lf\n", r->len, r->brd, r->area); return 0; } struct rectangle * area(float x, float y){ double area = (double)(x*y); static struct rectangle r; r.len = x; r.brd=y; r.area=area; return &r; }
Output
Input length and breadth of a rectangle Length: 10.500000 Breadth: 20.500000 Area: 215.250000
To Continue Learning Please Login
Login with Google