C Programming Language
C Programming Language
C Programming Language.......................................................................................................................................1
1) C as a mother language..................................................................................................................................2
2) C as a system programming language....................................................................................................2
3) C as a procedural language..........................................................................................................................2
4) C as a structured programming language.............................................................................................2
5) C as a mid-level programming language................................................................................................2
Features of C Language...........................................................................................................................................4
1) Simple...................................................................................................................................................................... 5
2) Machine Independent or Portable.............................................................................................................6
3) Mid-level programming language...............................................................................................................6
4) Structured programming language...........................................................................................................6
5) Rich Library...........................................................................................................................................................6
6) Memory Management.......................................................................................................................................6
7) Speed....................................................................................................................................................................... 6
8) Pointer.....................................................................................................................................................................6
9) Recursion...............................................................................................................................................................7
10) Extensible...........................................................................................................................................................7
How to install C............................................................................................................................................................7
1) Download Turbo C++ software....................................................................................................................7
2) Create turboc directory in c drive and extract the tc3.zip...........................................................7
3) Double click on the install.exe file and follow steps.......................................................................7
........................................................................................................................................................................................ 10
4) Click on the tc application located inside c:\TC\BIN.....................................................................10
First C Program...........................................................................................................................................................12
General Overview of a Simple C Program's Structure:.......................................................................12
Additional Information:.......................................................................................................................................13
Explain the First C program:........................................................................................................................14
To write, compile, and run your first C program, follow these steps:....................................15
How to compile and run the C program.....................................................................................................16
Conclusion:...............................................................................................................................................................16
Compilation process in c.......................................................................................................................................18
What is a compilation?.......................................................................................................................................18
1|Page
Preprocessor........................................................................................................................................................19
Compiler.................................................................................................................................................................19
Assembler..............................................................................................................................................................19
Linker.......................................................................................................................................................................19
printf() and scanf() in C...........................................................................................................................................22
printf() function...................................................................................................................................................23
scanf() function...................................................................................................................................................23
Program to print cube of given number..................................................................................................23
Program to print sum of 2 numbers..........................................................................................................24
Variables in C..............................................................................................................................................................25
Syntax:.................................................................................................................................................................... 25
Syntax:.................................................................................................................................................................... 26
Rules for defining variables..........................................................................................................................26
The three components of declaring a variable......................................................................................28
1. Variable Declaration:..................................................................................................................................28
2. Variable Definition:......................................................................................................................................28
3. Variable Initialization:................................................................................................................................29
Types of Variables in C.......................................................................................................................................30
Local Variable.....................................................................................................................................................30
Global Variable...................................................................................................................................................30
Static Variable....................................................................................................................................................31
Automatic Variable...........................................................................................................................................31
External Variable...............................................................................................................................................31
Conclusion:...............................................................................................................................................................32
Data Types in C..........................................................................................................................................................33
Basic Data Types...................................................................................................................................................33
Int:............................................................................................................................................................................. 35
Char:......................................................................................................................................................................... 35
Float:........................................................................................................................................................................ 35
Double:.................................................................................................................................................................... 35
Derived Data Type.................................................................................................................................................36
Array:....................................................................................................................................................................... 36
Pointer:.................................................................................................................................................................... 37
2|Page
Structure:...............................................................................................................................................................38
Union:.......................................................................................................................................................................39
Enumeration Data Type......................................................................................................................................40
Void Data Type........................................................................................................................................................41
Function Return Type:.....................................................................................................................................41
Function Parameters:......................................................................................................................................41
Pointers:.................................................................................................................................................................41
Conclusion:...............................................................................................................................................................42
Keywords in C.............................................................................................................................................................44
C Identifiers.................................................................................................................................................................. 67
Rules for constructing C identifiers.............................................................................................................68
Types of identifiers...............................................................................................................................................68
Differences between Keyword and Identifier.........................................................................................69
C Operators.................................................................................................................................................................. 70
Precedence of Operators in C.........................................................................................................................71
Arithmetic Operators:..........................................................................................................................................72
Relational Operators:..........................................................................................................................................74
Shift Operators:......................................................................................................................................................77
Logical Operators:.................................................................................................................................................78
Bitwise Operators:................................................................................................................................................79
Assignment Operator:.........................................................................................................................................82
Miscellaneous Operator:....................................................................................................................................82
Uses of Operators:................................................................................................................................................83
Conclusion:...............................................................................................................................................................84
Comments in C............................................................................................................................................................84
Single Line Comments........................................................................................................................................85
Multi Line Comments...........................................................................................................................................85
C Format Specifier....................................................................................................................................................86
Minimum Field Width Specifier.......................................................................................................................94
Specifying Precision............................................................................................................................................96
Escape Sequence in C............................................................................................................................................96
Regular Escape Sequences:............................................................................................................................97
Alarm or Beep (\a):............................................................................................................................................98
3|Page
Backspace (\b):...................................................................................................................................................98
Form Feed (\f):.....................................................................................................................................................99
New Line (\n):.......................................................................................................................................................99
Carriage Return (\r):..........................................................................................................................................99
Tab (Horizontal) (\t):.......................................................................................................................................100
Vertical Tab (\v):...............................................................................................................................................100
Backslash (\):.....................................................................................................................................................101
Single Quote ('):................................................................................................................................................101
Double Quote ("):..............................................................................................................................................101
Question Mark (?):...........................................................................................................................................102
Octal Number (\nnn):......................................................................................................................................102
Hexadecimal Number (\xhh):.....................................................................................................................103
Null (\0):................................................................................................................................................................103
Conclusion:.............................................................................................................................................................103
ASCII value in C........................................................................................................................................................105
What is ASCII code?...........................................................................................................................................106
Constants in C...........................................................................................................................................................109
Advantages of C Constants:...........................................................................................................................110
List of Constants in C........................................................................................................................................110
2 ways to define constant in C.....................................................................................................................110
1) C const keyword.............................................................................................................................................111
2) C #define preprocessor...............................................................................................................................111
Types of constant:..............................................................................................................................................112
Decimal Constant............................................................................................................................................112
Real or Floating-Point Constant:..............................................................................................................112
Octal Constant:.................................................................................................................................................113
Hexadecimal Constant:................................................................................................................................113
Character Constant........................................................................................................................................114
String Constant:...............................................................................................................................................114
Rules for constructing constants:..............................................................................................................114
Integer Constants:..........................................................................................................................................115
Floating-Point Constants:............................................................................................................................115
Octagonal Constants.....................................................................................................................................115
4|Page
Hexadecimal Constants:..............................................................................................................................115
Character Constants:.....................................................................................................................................115
String Constants:.............................................................................................................................................115
Conclusion:.............................................................................................................................................................116
Advantages of C Constants:...........................................................................................................................118
List of Constants in C........................................................................................................................................118
2 ways to define constant in C.....................................................................................................................118
1) C const keyword.............................................................................................................................................119
2) C #define preprocessor...............................................................................................................................119
Types of constant:..............................................................................................................................................120
Decimal Constant............................................................................................................................................120
Real or Floating-Point Constant:..............................................................................................................120
Octal Constant:.................................................................................................................................................121
Hexadecimal Constant:................................................................................................................................121
Character Constant........................................................................................................................................121
String Constant:...............................................................................................................................................122
Rules for constructing constants:..............................................................................................................122
Integer Constants:..........................................................................................................................................122
Floating-Point Constants:............................................................................................................................123
Octagonal Constants.....................................................................................................................................123
Hexadecimal Constants:..............................................................................................................................123
Character Constants:.....................................................................................................................................123
String Constants:.............................................................................................................................................123
Conclusion:.............................................................................................................................................................124
What are literals?....................................................................................................................................................125
Types of literals....................................................................................................................................................125
Integer literal.....................................................................................................................................................125
It can be specified in the following three ways:..............................................................................125
Decimal number (base 10)..........................................................................................................................125
Octal number (base 8)...................................................................................................................................125
Hexadecimal number (base 16)................................................................................................................126
Float literal.........................................................................................................................................................126
Decimal form......................................................................................................................................................126
5|Page
Exponential form..............................................................................................................................................127
Character literal...............................................................................................................................................128
String literal.......................................................................................................................................................129
Tokens in C.................................................................................................................................................................130
C Boolean....................................................................................................................................................................135
Syntax.................................................................................................................................................................... 135
Boolean Array........................................................................................................................................................136
typedef...................................................................................................................................................................... 136
Boolean with Logical Operators..................................................................................................................137
Static in C.................................................................................................................................................................... 140
Static keyword can be used in the following situations:............................................................140
Static variable...................................................................................................................................................141
Static Function.................................................................................................................................................142
Differences b/w static and global variable.........................................................................................142
Differences b/w static local and static global variable................................................................142
Properties of a static variable..................................................................................................................143
Programming Errors in C......................................................................................................................................144
Syntax error........................................................................................................................................................144
Run-time error...................................................................................................................................................146
Linker error.........................................................................................................................................................147
Logical error.......................................................................................................................................................147
Semantic error..................................................................................................................................................148
Compile time vs Runtime.....................................................................................................................................151
Compile-time errors........................................................................................................................................151
Syntax errors.....................................................................................................................................................151
Semantic errors................................................................................................................................................151
Runtime errors..................................................................................................................................................152
Division by Zero:...............................................................................................................................................152
Accessing Array Out of Bounds:..............................................................................................................153
Null Pointer Dereference:............................................................................................................................153
Stack Overflow:................................................................................................................................................154
Unused variables:............................................................................................................................................154
Conclusion:.............................................................................................................................................................157
6|Page
Conditional Operator in C....................................................................................................................................157
Syntax of a conditional operator.............................................................................................................158
Bitwise Operator in C............................................................................................................................................162
Bitwise AND operator....................................................................................................................................163
Bitwise OR operator.......................................................................................................................................164
Bitwise exclusive OR operator.................................................................................................................165
Bitwise complement operator...................................................................................................................166
Bitwise shift operators.................................................................................................................................167
What is the 2s complement in C?....................................................................................................................170
Analysis of the above program,................................................................................................................172
Conclusion:.............................................................................................................................................................174
C Fundamental Test 1...........................................................................................................................................175
1) Which of the following is the first operating system developed using C programming
language?................................................................................................................................................................ 175
2) The C compiler used for UNIX operating system is.....................................................................175
3) Which of the following is a logical AND operator?........................................................................175
4) Which format specifier is used for printing double value?.......................................................176
5) Which of the following statement is used to free the allocated memory space for a
program?.................................................................................................................................................................. 176
C if else Statement.................................................................................................................................................178
If Statement...........................................................................................................................................................178
Program to find the largest number of the three............................................................................180
If-else Statement.................................................................................................................................................180
Program to check whether a person is eligible to vote or not.................................................182
If else-if ladder Statement..............................................................................................................................183
Program to calculate the grade of the student according to the specified marks.......185
C Switch Statement...............................................................................................................................................186
Rules for switch statement in C language..........................................................................................186
Flowchart of switch statement in C.......................................................................................................188
Functioning of switch case statement.....................................................................................................188
How does C switch statement work?...................................................................................................189
Example of a switch statement in C......................................................................................................190
Switch case example 2................................................................................................................................191
Break and Default keyword in Switch statement...............................................................................191
7|Page
1. Break Keyword:...........................................................................................................................................191
2. Default Keyword:........................................................................................................................................192
C Switch statement is fall-through.........................................................................................................194
Nested switch case statement................................................................................................................195
Advantages of the switch statement:.......................................................................................................196
Disadvantages of the switch statement:................................................................................................196
if-else vs switch.......................................................................................................................................................197
What is an if-else statement?....................................................................................................................197
What is a switch statement?.....................................................................................................................197
Similarity b/w if-else and switch..............................................................................................................198
Differences b/w if-else and switch statement..................................................................................198
C Loops.........................................................................................................................................................................202
Why use loops in C language?.......................................................................................................................202
Advantage of loops in C...............................................................................................................................202
Types of C Loops.................................................................................................................................................202
do-while loop in C............................................................................................................................................202
while loop in C...................................................................................................................................................203
for loop in C........................................................................................................................................................203
do while loop in C....................................................................................................................................................203
do while loop syntax......................................................................................................................................203
Working of do while Loop in C...................................................................................................................204
Example of do while loop in C:..................................................................................................................205
Infinite do while loop.....................................................................................................................................208
Nested do while loop in C............................................................................................................................208
Difference between while and do while Loop.......................................................................................209
Features of do while loop................................................................................................................................210
while loop in C...........................................................................................................................................................211
Example of the while loop in C language................................................................................................212
Program to print table for the given number using while loop in C...........................................213
Properties of while loop...................................................................................................................................213
Infinitive while loop in C..................................................................................................................................215
for loop in C................................................................................................................................................................ 215
Syntax of for loop in C...................................................................................................................................215
8|Page
Flowchart of for loop in C............................................................................................................................216
C for loop Examples.......................................................................................................................................216
C Program: Print table for the given number using C for loop..................................................217
Properties of Expression 1..........................................................................................................................217
Properties of Expression 2..........................................................................................................................218
Loop body............................................................................................................................................................221
Infinitive for loop in C....................................................................................................................................221
Nested Loops in C...................................................................................................................................................222
Infinite Loop in C......................................................................................................................................................227
What is infinite loop?.........................................................................................................................................227
When to use an infinite loop..........................................................................................................................227
For loop.................................................................................................................................................................228
while loop............................................................................................................................................................229
Techniques for Preventing Infinite Loops:..............................................................................................235
Conclusion:.............................................................................................................................................................236
C break statement..................................................................................................................................................236
Syntax:.................................................................................................................................................................. 237
Flowchart of break in c.................................................................................................................................237
Example................................................................................................................................................................237
How does the break statement work?......................................................................................................238
Use of break statements in different cases with their examples:.............................................238
2. Nested Loops:..............................................................................................................................................240
3. Infinite Loops:..............................................................................................................................................241
4. Switch Case:.................................................................................................................................................243
Features of the Break Statement................................................................................................................245
C continue statement............................................................................................................................................246
Syntax:.................................................................................................................................................................. 246
Continue statement example 1....................................................................................................................246
Continue statement example 2....................................................................................................................246
C continue statement with inner loop......................................................................................................247
C goto statement.....................................................................................................................................................248
goto example.........................................................................................................................................................248
When should we use goto?.............................................................................................................................249
9|Page
Type Casting in C....................................................................................................................................................250
Syntax:.................................................................................................................................................................. 250
Types of Type Casting......................................................................................................................................250
Implicit Casting:...............................................................................................................................................250
Explicit Casting:...............................................................................................................................................251
Narrowing Conversion:.....................................................................................................................................252
Widening Conversion:........................................................................................................................................253
Advantages of Type Casting..........................................................................................................................254
Conclusion:.............................................................................................................................................................255
C Functions.................................................................................................................................................................255
Advantage of functions in C...........................................................................................................................255
Function Aspects.................................................................................................................................................256
Types of Functions.............................................................................................................................................256
Return Value..........................................................................................................................................................257
Different aspects of function calling.........................................................................................................258
Example for Function without argument and return value.........................................................258
Example for Function without argument and with return value..............................................259
Example for Function with argument and without return value..............................................260
Example for Function with argument and with return value.....................................................262
C Library Functions............................................................................................................................................263
Additional details regarding C functions are provided below:.................................................264
Conclusion:.............................................................................................................................................................265
Call by value and Call by reference in C......................................................................................................266
Call by value in C.................................................................................................................................................266
Call by reference in C........................................................................................................................................268
Difference between call by value and call by reference in c........................................................269
Recursion in C...........................................................................................................................................................269
Recursive Function.............................................................................................................................................271
Example of recursion in C...............................................................................................................................271
Memory allocation of Recursive method.................................................................................................272
Storage Classes in C..............................................................................................................................................273
Automatic................................................................................................................................................................274
Static......................................................................................................................................................................... 275
10 | P a g e
Register.................................................................................................................................................................... 276
External.................................................................................................................................................................... 277
C Array.........................................................................................................................................................................279
Properties of Array..........................................................................................................................................280
Advantage of C Array.....................................................................................................................................280
Disadvantage of C Array..............................................................................................................................280
Declaration of C Array.......................................................................................................................................280
Initialization of C Array.....................................................................................................................................281
C array example...............................................................................................................................................281
C Array: Declaration with Initialization....................................................................................................282
C Array Example: Sorting an array.............................................................................................................282
Program to print the largest and second largest element of the array...................................283
Two Dimensional Array in C...............................................................................................................................284
Declaration of two dimensional Array in C.............................................................................................284
Initialization of 2D Array in C.........................................................................................................................284
Two-dimensional array example in C....................................................................................................284
C 2D array example: Storing elements in a matrix and printing it.........................................285
Return an Array in C...............................................................................................................................................286
What is an Array?.................................................................................................................................................286
Passing Array to Function in C.........................................................................................................................294
Methods to declare a function that receives an array as an argument...............................295
C language passing an array to function example.........................................................................295
C function to sort the array............................................................................................................................296
Returning array from the function..............................................................................................................297
C Pointers.................................................................................................................................................................... 298
Declaring a pointer.............................................................................................................................................299
Pointer Example...............................................................................................................................................299
Pointer to array.................................................................................................................................................300
Pointer to a function......................................................................................................................................300
Pointer to structure........................................................................................................................................300
Advantage of pointer.........................................................................................................................................300
Usage of pointer...................................................................................................................................................300
Address Of (&) Operator...................................................................................................................................301
11 | P a g e
NULL Pointer..........................................................................................................................................................301
Pointer Program to swap two numbers without using the 3rd variable..................................301
Reading complex pointers..............................................................................................................................302
Explanation.........................................................................................................................................................303
C Double Pointer (Pointer to Pointer)............................................................................................................303
C double pointer example...............................................................................................................................304
Q. What will be the output of the following program?......................................................................305
Pointer Arithmetic in C.........................................................................................................................................308
Incrementing Pointer in C...............................................................................................................................308
32-bit...................................................................................................................................................................... 309
64-bit...................................................................................................................................................................... 309
Traversing an array by using pointer.....................................................................................................309
Decrementing Pointer in C..............................................................................................................................310
32-bit...................................................................................................................................................................... 310
64-bit...................................................................................................................................................................... 310
C Pointer Addition...............................................................................................................................................310
32-bit...................................................................................................................................................................... 310
64-bit...................................................................................................................................................................... 311
C Pointer Subtraction........................................................................................................................................311
32-bit...................................................................................................................................................................... 311
64-bit...................................................................................................................................................................... 311
Illegal arithmetic with pointers....................................................................................................................313
Pointer to function in C.....................................................................................................................................313
Pointer to Array of functions in C................................................................................................................314
Dangling Pointers in C...........................................................................................................................................315
sizeof() operator in C.............................................................................................................................................320
Need of sizeof() operator.............................................................................................................................320
When operand is a data type.....................................................................................................................320
When operand is an expression...............................................................................................................321
Handling Arrays and Structures...................................................................................................................321
Allocation of dynamic memory and pointer arithmetic....................................................................323
Sizeof() for Unions...............................................................................................................................................324
Sizeof() Operator Requirement in C...........................................................................................................325
12 | P a g e
Conclusion:.............................................................................................................................................................326
const Pointer in C....................................................................................................................................................326
Constant Pointers............................................................................................................................................326
Syntax of Constant Pointer.........................................................................................................................326
Pointer to Constant........................................................................................................................................328
Syntax of Pointer to Constant...................................................................................................................328
Constant Pointer to a Constant................................................................................................................330
Syntax.................................................................................................................................................................... 330
void pointer in C.......................................................................................................................................................331
Syntax of void pointer...................................................................................................................................331
Size of the void pointer in C.......................................................................................................................332
Advantages of void pointer.........................................................................................................................333
Why we use void pointers?.........................................................................................................................336
C dereference pointer...........................................................................................................................................337
Why we use dereferencing pointer?...........................................................................................................337
Dynamic memory allocation in C.....................................................................................................................340
malloc() function in C........................................................................................................................................341
calloc() function in C..........................................................................................................................................342
realloc() function in C........................................................................................................................................343
free() function in C..............................................................................................................................................343
C Strings.......................................................................................................................................................................344
Difference between char array and string literal............................................................................344
String Example in C............................................................................................................................................345
Traversing String.................................................................................................................................................345
Using the length of string............................................................................................................................345
Using the null character..............................................................................................................................346
Accepting string as the input........................................................................................................................347
Some important points.................................................................................................................................348
Pointers with strings..........................................................................................................................................348
C gets() and puts() functions.............................................................................................................................350
C gets() function..................................................................................................................................................350
C puts() function..................................................................................................................................................351
C String Functions..................................................................................................................................................352
13 | P a g e
C String Length: strlen() function....................................................................................................................352
C Copy String: strcpy()..........................................................................................................................................353
Strcat() function in C.............................................................................................................................................353
Conclusion:.............................................................................................................................................................355
Strcmp() function in C...........................................................................................................................................355
C Reverse String: strrev()....................................................................................................................................357
Let's talk about the drawbacks of strrev() and why it is not advised:.................................358
Strlwr() function in C.............................................................................................................................................359
Syntax:.................................................................................................................................................................. 359
Value Returned:................................................................................................................................................360
Problems with Safer Input Reading and gets().....................................................................................361
Conclusion:.............................................................................................................................................................361
C String Uppercase: strupr()..............................................................................................................................362
Benefits of strupr() function:.........................................................................................................................362
Cautions:.................................................................................................................................................................. 363
Conclusion:.............................................................................................................................................................363
Strstr() function in C..............................................................................................................................................363
Syntax:.................................................................................................................................................................. 364
Function Name:.................................................................................................................................................364
Return Type:.......................................................................................................................................................364
Parameters:........................................................................................................................................................364
Function Behavior:..........................................................................................................................................364
Case Sensitivity:..............................................................................................................................................364
Application:.........................................................................................................................................................365
Features of the strstr() function in c.........................................................................................................366
Advantages and disadvantages of strstr() function in C:................................................................368
Advantages:........................................................................................................................................................368
Disadvantages:.................................................................................................................................................368
Conclusion:.............................................................................................................................................................369
C Math........................................................................................................................................................................... 370
C Math Functions.................................................................................................................................................370
C Math Example...............................................................................................................................................370
C Structure Union....................................................................................................................................................372
14 | P a g e
C structure.................................................................................................................................................................. 372
Why use structure?.............................................................................................................................................372
What is Structure.................................................................................................................................................373
Declaring structure variable..........................................................................................................................374
Which approach is good...............................................................................................................................375
Accessing members of the structure........................................................................................................375
C Structure example......................................................................................................................................376
typedef in C................................................................................................................................................................377
Syntax of typedef.............................................................................................................................................377
Using typedef with structures..................................................................................................................378
Using typedef with pointers.......................................................................................................................380
C Array of Structures.............................................................................................................................................381
Why use an array of structures?..................................................................................................................381
Array of Structures in C....................................................................................................................................382
Nested Structure in C............................................................................................................................................384
1) Separate structure....................................................................................................................................386
2) Embedded structure.................................................................................................................................386
Accessing Nested Structure..........................................................................................................................387
C Nested Structure example.........................................................................................................................387
Passing structure to function........................................................................................................................388
Structure Padding in C..........................................................................................................................................389
What is the size of the struct student?................................................................................................389
Structure Padding...........................................................................................................................................390
Why structure padding?...............................................................................................................................390
What's the problem?......................................................................................................................................391
How is structure padding done?..............................................................................................................391
Changing order of the variables...............................................................................................................392
How to avoid the structure padding in C?..........................................................................................394
Union in C.................................................................................................................................................................... 396
Deciding the size of the union...................................................................................................................397
Accessing members of union using pointers....................................................................................397
Why do we need C unions?.........................................................................................................................398
C FILE HANDLIND....................................................................................................................................................401
15 | P a g e
File handling in C.....................................................................................................................................................401
Functions for file handling..............................................................................................................................401
Opening File: fopen()..........................................................................................................................................402
Closing File: fclose()..........................................................................................................................................404
C fprintf() and fscanf().......................................................................................................................................404
C fputc() and fgetc()...........................................................................................................................................404
C fputs() and fgets()...........................................................................................................................................404
C fseek()...................................................................................................................................................................405
C fprintf() and fscanf()...........................................................................................................................................405
Writing File : fprintf() function.......................................................................................................................405
Reading File : fscanf() function....................................................................................................................405
C File Example: Storing employee information....................................................................................406
C fputs() and fgets()...............................................................................................................................................407
Writing File : fputs() function.........................................................................................................................407
Reading File : fgets() function.......................................................................................................................408
C fseek() function....................................................................................................................................................409
Understanding the fseek() Parameters:...................................................................................................409
Detailed Understanding of the fseek() Function..................................................................................410
Regular Use Cases of fseek()........................................................................................................................410
Example 1:...........................................................................................................................................................411
Example 2:...........................................................................................................................................................412
Example 3:...........................................................................................................................................................412
Example 4:...........................................................................................................................................................413
C rewind() function.................................................................................................................................................414
C ftell() function.......................................................................................................................................................415
Conclusion:.............................................................................................................................................................417
C PREPROCESSOR..................................................................................................................................................418
C Preprocessor Directives..................................................................................................................................418
What is Macro??...................................................................................................................................................419
C Macros...................................................................................................................................................................... 419
Object-like Macros..............................................................................................................................................419
Function-like Macros.........................................................................................................................................419
C Predefined Macros..........................................................................................................................................420
16 | P a g e
C predefined macros example......................................................................................................................420
Advantages of Using Macros:........................................................................................................................420
When Using Macros, Exercise Caution:...................................................................................................421
Macros' best practices:....................................................................................................................................421
Macros and Conditional Compilation:.......................................................................................................422
Using Inline Functions vs. Macros:.........................................................................................................422
Using macros for debugging:.....................................................................................................................422
Conclusion:.............................................................................................................................................................422
C #include....................................................................................................................................................................422
#include directive example............................................................................................................................423
#include notes:.....................................................................................................................................................423
C #define...................................................................................................................................................................... 423
Syntax:.................................................................................................................................................................. 424
Uses:.......................................................................................................................................................................... 425
Conclusion:.............................................................................................................................................................425
C #undef.......................................................................................................................................................................426
C #ifdef.......................................................................................................................................................................... 427
C #ifdef example..................................................................................................................................................427
C #ifndef.......................................................................................................................................................................428
C #ifndef example...............................................................................................................................................429
C #if................................................................................................................................................................................ 430
C #if example.........................................................................................................................................................430
C #else.......................................................................................................................................................................... 431
C #else example...................................................................................................................................................432
C #error......................................................................................................................................................................... 432
C #error example.................................................................................................................................................433
C #pragma...................................................................................................................................................................434
Command Line Arguments in C........................................................................................................................435
Example.................................................................................................................................................................... 435
C MISK.......................................................................................................................................................................... 437
C Expressions............................................................................................................................................................437
Arithmetic Expressions....................................................................................................................................438
Relational Expressions.....................................................................................................................................439
17 | P a g e
Logical Expressions...........................................................................................................................................440
Conditional Expressions..................................................................................................................................442
C Programming Language
C language Tutorial with programming approach for beginners and professionals, helps you to
understand the C language tutorial easily. Our C tutorial explains each topic with programs.
The C Language is developed by Dennis Ritchie for creating system applications that directly interact
with the hardware devices such as drivers, kernels, etc.
C programming is considered as the base for other programming languages, that is why it is known
as mother language.
1. Mother language
2. System programming language
3. Procedure-oriented programming language
4. Structured programming language
5. Mid-level programming language
18 | P a g e
1) C as a mother language
C language is considered as the mother language of all the modern programming languages because most of
the compilers, JVMs, Kernels, etc. are written in C language, and most of the programming languages
follow C syntax, for example, C++, Java, C#, etc.
It provides the core concepts like the array, strings, functions, file handling, etc. that are being used in many
languages like C++, Java, C#, etc.
It can't be used for internet programming like Java, .Net, PHP, etc.
3) C as a procedural language
A procedure is known as a function, method, routine, subroutine, etc. A procedural language specifies a
series of steps for the program to solve the problem.
A procedural language breaks the program into functions, data structures, etc.
C is a procedural language. In C, variables and function prototypes must be declared before being
used.
In the C language, we break the program into parts using functions. It makes the program easier to
understand and modify.
19 | P a g e
5) C as a mid-level programming language
C is considered as a middle-level language because it supports the feature of both low-level and
high-level languages. C language program is converted into assembly code, it supports pointer
arithmetic (low-level), but it is machine independent (a feature of high-level).
A Low-level language is specific to one machine, i.e., machine dependent. It is machine dependent,
fast to run. But it is not easy to understand.
A High-Level language is not specific to one machine, i.e., machine independent. It is easy to
understand.
File: main.c
1. #include <stdio.h>
2. int main() {
3. printf("Hello C Programming\n");
4. return 0;
5. }
History of C Language
20 | P a g e
History of C language is interesting to know. Here we are going to discuss a brief history of the c
language.
C programming language was developed in 1972 by Dennis Ritchie at bell laboratories of AT&T
(American Telephone & Telegraph), located in the U.S.A.
It was developed to overcome the problems of previous languages such as B, BCPL, etc.
Initially, C language was developed to be used in UNIX operating system. It inherits many features of
previous languages such as B and BCPL.
Let's see the programming languages that were developed before C language.
21 | P a g e
Features of C Language
C is the widely used language. It provides many features that are given below.
1. Simple
2. Machine Independent or Portable
3. Mid-level programming language
4. structured programming language
5. Rich Library
6. Memory Management
7. Fast Speed
8. Pointers
9. Recursion
10. Extensible
1) Simple
C is a simple language in the sense that it provides a structured approach (to break the problem into
parts), the rich set of library functions, data types, etc.
22 | P a g e
2) Machine Independent or Portable
Unlike assembly language, c programs can be executed on different machines with some machine
specific changes. Therefore, C is a machine independent language.
5) Rich Library
C provides a lot of inbuilt functions that make the development fast.
6) Memory Management
It supports the feature of dynamic memory allocation. In C language, we can free the allocated
memory at any time by calling the free() function.
7) Speed
The compilation and execution time of C language is fast since there are lesser inbuilt functions and
hence the lesser overhead.
8) Pointer
C provides the feature of pointers. We can directly interact with the memory by using the pointers.
We can use pointers for memory, structures, functions, array, etc.
23 | P a g e
9) Recursion
In C, we can call the function within the function. It provides code reusability for every function.
Recursion enables us to use the approach of backtracking.
10) Extensible
C language is extensible because it can easily adopt new features.
How to install C
There are many compilers available for c and c++. You need to download any one. Here, we are going
to use Turbo C++. It will work for both C and C++. To install the Turbo C software, you need to
follow following steps.
24 | P a g e
Change your drive to c, press c.
Press enter, it will look inside the c:\turboc directory for the required files.
25 | P a g e
Select Start installation by the down arrow key then press enter.
26 | P a g e
Now C is installed, press enter to read documentation or close the
software.
ADVERTISEMENT
27 | P a g e
In windows 7
or window 8, it will show a dialog block to ignore and close the application because fullscreen mode
is
28 | P a g e
First C Program
General Overview of a Simple C Program's
Structure:
The general architecture of a simple C program typically consists of several vital components. Below is an
outline of the essential elements and their purposes:
o Header Files:
The #include directives at the beginning of the program are used to include header files. Header
files provide function prototypes and definitions that allow the C compiler to understand the functions used
in the program.
o Main Function:
Every C program starts with the main function. It is the program's entry point, and execution starts from
here. The main function has a return type of int, indicating that it should return an integer value to the
operating system upon completion.
o Variable Declarations:
Before using any variables, you should declare them with their data types. This section is typically placed
after the main function's curly opening brace.
This section contains the actual instructions and logic of the program. C programs are composed of
statements that perform actions and expressions that compute values.
o Comments:
Comments are used to provide human-readable explanations within the code. They are not
executed and do not affect the program's functionality. In C, comments are denoted by // for single-
line comments and /* */ for multi-line comments.
o Functions:
C programs can include user-defined functions and blocks of code that perform specific tasks.
Functions help modularize the code and make it more organized and manageable.
29 | P a g e
o Return Statement:
Use the return statement to terminate a function and return a value to the caller function. A return
statement with a value of 0 typically indicates a successful execution in the main function, whereas
a non-zero value indicates an error or unexpected termination.
o Standard Input/Output:
C has library functions for reading user input (scanf) and printing output to the console (printf).
These functions are found in C programs and are part of the standard I/O library (stdio.h header file).
It is essential to include these fundamental features correctly while writing a simple C program to
ensure optimal functionality and readability.
Additional Information:
There is some additional information about the C programs. Some additional information is as
follows:
o Preprocessor Directives:
C programs often include preprocessor directives that begin with a # symbol. These directives are
processed by the preprocessor before actual compilation and are used to include header files,
define macros, and perform conditional compilation.
o Data Types:
C supports data types such as int, float, double, char, etc. It depends on the program's
requirements, and appropriate data types should be chosen to store and manipulate data efficiently.
o Control Structures:
C provides control structures like if-else, while, for, and switch-case that allow you to make
decisions and control the flow of the program.
o Error Handling:
o Modularization:
30 | P a g e
As programs grow in complexity, it becomes essential to modularize the code by creating separate
functions for different tasks. This practice improves code reusability and maintainability.
Remember, the architecture and complexity of a C program can vary significantly depending on the
specific application and requirements. The outline is a general overview of a simple C program's
structure.
Code:
1. #include <stdio.h>
2. int main(){
3. printf("Hello C Language");
4. return 0;
5. }
#include <stdio.h>:
In this line, the program includes the standard input/output library (stdio.h) due to the
preprocessor directive. For input and output tasks, the stdio.h library contains methods
like printf and scanf.
It is the main function which is the entry point of the C program. The program starts executing from
the beginning of the main function.
Use the printf() function to print formatted output to the console. In this example, the string "Hello,
C Language" is printed, followed by a newline character (n) which moves the pointer to the
following line after the message is displayed.
return 0;
When the return statement is 0, the program has been completed. When determining the state of a
program, the operating system frequently uses the value returned by the main function. A return
value of 0 often indicates that the execution was successful.
31 | P a g e
After compilation and execution, this C program will quit with a status code 0 and output "Hello, C
Language" to the terminal.
Open a text editor of your choice, such as Notepad, Sublime Text, or Visual Studio Code. It will be
where you write your C code.
Now, copy and paste the following code into the text editor:
1. #include <stdio.h>
2. int main() {
3. printf("Hello, C Language");
4. return 0;
5. }
After that, save the file with a .c extension such as first_program.c. This extension indicates that it is
a C source code file.
After successful compilation, you can run the program by executing the generated executable file.
Enter the following command into the terminal or command prompt:
1. ./first_program
The program will execute, and you will see the output on the console:
32 | P a g e
Output:
Hello, C Language
By Menu
o Now click on the compile menu, then compile sub-menu to compile the c program.
o Then click on the run menu and the sub-menu to run the c program.
By shortcut
o Or, press the ctrl+f9 keys to compile and run the program directly.
o You will see the following output on the user screen.
o You can view the user screen any time by pressing the alt+f5 keys.
o Now press Esc to return to the turbo c++ console.
Conclusion:
Finally, the first C program introduces the C programming language and its fundamental structure. It
illustrates the necessary components for writing, compiling, and running a C program.
The program contains the standard input-output library (stdio.h), which includes routines for
output operations such as printf(). The main() function is the program's entry point, from which
execution begins. The printf() function is used within the main() method to print the
message "Hello, C Language" to the console.
A C compiler such as GCC is required to compile the program. The code is stored in a text file with
the .c extension, and the compiler is started by typing gcc, followed by the names of
the input and output files.
By following these instructions, you will get a basic grasp of developing, constructing, and running a C
program. It offers the groundwork for further investigating more complex ideas and developing more
sophisticated applications using the C programming language.
33 | P a g e
34 | P a g e
.
Compilation process in c
What is a compilation?
The compilation is a process of converting the source code into object code. It is done with the help of the
compiler. The compiler checks the source code for the syntactical or structural errors, and if the source code is
error-free, then it generates the object code.
The c compilation process converts the source code taken as input into the object code or machine code. The
compilation process can be divided into four steps, i.e., Pre-processing, Compiling, Assembling, and Linking.
The preprocessor takes the source code as an input, and it removes all the comments from the source code. The
preprocessor takes the preprocessor directive and interprets it. For example, if <stdio.h>, the directive is
available in the program, then the preprocessor interprets the directive and replace this directive with the
content of the 'stdio.h' file.
The following are the phases through which our program passes before being transformed into an executable
form:
o Preprocessor
o Compiler
o Assembler
o Linker
35 | P a g e
Preprocessor
The source code is the code which is written in a text editor and the source code file is given an extension ".c".
This source code is first passed to the preprocessor, and then the preprocessor expands this code. After
expanding the code, the expanded code is passed to the compiler.
Compiler
The code which is expanded by the preprocessor is passed to the compiler. The compiler converts this code into
assembly code. Or we can say that the C compiler converts the pre-processed code into assembly code.
Assembler
The assembly code is converted into object code by using an assembler. The name of the object file generated
by the assembler is the same as the source file. The extension of the object file in DOS is '.obj,' and in UNIX,
the extension is 'o'. If the name of the source file is 'hello.c', then the name of the object file would be
'hello.obj'.
Linker
Mainly, all the programs written in C use library functions. These library functions are pre-compiled, and the
object code of these library files is stored with '.lib' (or '.a') extension. The main working of the linker is to
combine the object code of library files with the object code of our program. Sometimes the situation arises
when our program refers to the functions defined in other files; then linker plays a very important role in this. It
links the object code of these files to our program. Therefore, we conclude that the job of the linker is to link the
object code of our program with the object code of the library files and other files. The output of the linker is
the executable file. The name of the executable file is the same as the source file but differs only in their
extensions. In DOS, the extension of the executable file is '.exe', and in UNIX, the executable file can be named
as 'a.out'. For example, if we are using printf() function in a program, then the linker adds its associated code in
an output file.
hello.c
1. #include <stdio.h>
2. int main()
3. {
4. printf("Hello javaTpoint");
5. return 0;
6. }
36 | P a g e
Now, we will create a flow diagram of the above program:
37 | P a g e
38 | P a g e
In the above flow diagram, the following steps are taken to execute a program:
o Firstly, the input file, i.e., hello.c, is passed to the preprocessor, and the preprocessor converts
the source code into expanded source code. The extension of the expanded source code would
be hello.i.
o The expanded source code is passed to the compiler, and the compiler converts this expanded
source code into assembly code. The extension of the assembly code would be hello.s.
o This assembly code is then sent to the assembler, which converts the assembly code into
object code.
o After the creation of an object code, the linker creates the executable file. The loader will then
load the executable file for the execution.
1. printf("format string",argument_list);
scanf() function
The scanf() function is used for input. It reads the input data from the console.
1. scanf("format string",argument_list);
Program to print cube of given number
Let's see a simple example of c language that gets input from the user and prints the cube of the
given number.
1. #include<stdio.h>
2. int main(){
3. int number;
4. printf("enter a number:");
5. scanf("%d",&number);
6. printf("cube of number is:%d ",number*number*number);
7. return 0;
8. }
Output
enter a number:5
cube of number is:125
The scanf("%d",&number) statement reads integer number from the console and stores the given
value in number variable.
40 | P a g e
Program to print sum of 2 numbers
Let's see a simple example of input and output in C language that prints addition of 2 numbers.
1. #include<stdio.h>
2. int main(){
3. int x=0,y=0,result=0;
4.
5. printf("enter first number:");
6. scanf("%d",&x);
7. printf("enter second number:");
8. scanf("%d",&y);
9.
10. result=x+y;
11. printf("sum of 2 numbers:%d ",result);
12.
13. return 0;
14. }
Output
41 | P a g e
Variables in C
A variable is the name of the memory location. It is used to store information. Its value can be altered
and reused several times. It is a way to represent memory location through symbols so that it can be
easily identified.
Variables are key building elements of the C programming language used to store and modify data
in computer programs. A variable is a designated memory region that stores a specified data type
value. Each variable has a unique identifier, its name, and a data type describing the type of data it
may hold.
Syntax:
The syntax for defining a variable in C is as follows:
1. data_type variable_name;
Here,
data_type: It represents the type of data the variable can hold. Examples of data types in C include int
(integer), float (a floating-point number), char (character), double (a double-precision floating-point
number),
o variable_name: It is the identifier for the variable, i.e., the name you give to the variable to access
its value later in the program. The variable name must follow specific rules, like starting with
a letter or underscore and consisting of letters, digits, and underscores.
1. int age;
It declares an integer variable named age without assigning it a specific value. Variables can also be
initialized at the time of declaration by assigning an initial value to them. For instance:
1. int count = 0;
42 | P a g e
Note: Variables should be defined before they are used within the program. The scope of a
variable determines where it is accessible. Variables declared inside a function or block are
considered local variables, while declared outside any function are considered global variables.
Syntax:
Let us see the syntax to declare a variable:
1. type variable_list;
1. int a;
2. float b;
3. char c;
Here, a, b, and c are variables. The int, float, and char are the data types.
o Allowed Characters:
Variable names include letters ( uppercase and lowercase ), digits, and underscores. They must
start with a letter (uppercase or lowercase) or an underscore.
o Case Sensitivity:
C is a case-sensitive programming language. It means that uppercase and lowercase letters are
considered distinct.
For example, myVar, MyVar, and myvar are all considered different variable names.
o Keywords:
43 | P a g e
Variable names cannot be the same as C keywords (reserved words), as they have special meanings
in the language.
For example, you cannot use int, float, char, for, while, etc., as variable names.
o Length Limitation:
There is no standard limit for the length of variable names in C, but it's best to keep them reasonably
short and descriptive.
o Reserved Identifiers:
While not strictly a rule, it is advisable to avoid specific patterns or identifiers common in libraries or
standard usage.
ADVERTISEMENT
For example, variables starting with __ (double underscores) are typically reserved for system
or compiler-specific usage.
1. int age;
2. float salary;
3. char _status;
4. double average_score;
5. int studentCount;
Following these rules ensures that your variable names are valid and conform to the C language's
syntax and conventions. Choosing meaningful and descriptive names for variables is essential to
enhance the readability and maintainability of your code.
1. Variable Declaration:
The process of telling the compiler about a variable's existence and data type is known as variable
declaration. It notifies the compiler that a variable with a specific name and data type will be used in
the program. Still, no memory for the variable is allocated at this moment. It is usually seen at the
start of a function or block before the variable is utilized.
1. data_type variable_name;
1. #include <stdio.h>
2.
3. int main() {
4. // Variable declaration
5. int age;
6. float salary;
7. char initial;
8.
9. return 0;
10. }
2. Variable Definition:
The process of reserving memory space for the variable to keep its contents during program
execution is known as a variable definition. It is based on the data type and connects the variable
name with a particular memory address of sufficient size.
45 | P a g e
A variable in C can be declared and defined in the same statement, although they can also be
separated if necessary.
1. #include <stdio.h>
2.
3. int main() {
4. // Variable definition
5. int age = 25;
6. float salary = 2500.5;
7. char initial = 'J';
8.
9. return 0;
10. }
3. Variable Initialization:
Variable declaration is the act of informing the compiler about the existence and data type of a
variable. It informs the compiler that a variable with a specific name and data type will be used in the
program, but that memory for the variable still needs to be allocated.
Not explicitly initialized variables will contain garbage/random data that may result in unexpected
program behavior.
ADVERTISEMENT
1. #include <stdio.h>
2. int main() {
3. // Variable definition and initialization
4. int age = 25;
5. float salary = 2500.5;
6. char initial = 'J';
7. // Later in the program, you can change the value of the variable
8. age = 30;
9. salary = 3000.0;
10.
11. return 0;
12. }
46 | P a g e
In the example above, we have variable age, salary, and initial declarations. After that, we define
these variables and initialize them with initial values (e.g., age = 25). Later in the program, we can
modify the values of these variables (e.g., age = 30).
Types of Variables in C
There are many types of variables in c:
1. local variable
2. global variable
3. static variable
4. automatic variable
5. external variable
Local Variable
A variable that is declared inside the function or block is called a local variable.
1. void function1(){
2. int x=10;//local variable
3. }
Global Variable
A variable that is declared outside the function or block is called a global variable. Any function can
change the value of the global variable. It is available to all the functions.
47 | P a g e
Static Variable
A variable that is declared with the static keyword is called static variable.
1. void function1(){
2. int x=10;//local variable
3. static int y=10;//static variable
4. x=x+1;
5. y=y+1;
6. printf("%d,%d",x,y);
7. }
If you call this function many times, the local variable will print the same value for each function
call, e.g, 11,11,11 and so on. But the static variable will print the incremented value in each
function call, e.g. 11, 12, 13 and so on.
Automatic Variable
All variables in C that are declared inside the block, are automatic variables by default. We can
explicitly declare an automatic variable using auto keyword.
1. void main(){
2. int x=10;//local variable (also automatic)
3. auto int y=20;//automatic variable
4. }
External Variable
We can share a variable in multiple C source files by using an external variable. To declare an external
variable, you need to use extern keyword.
myfile.h
1. #include "myfile.h"
2. #include <stdio.h>
3. void printValue(){
4. printf("Global variable: %d", global_variable);
48 | P a g e
5. }
Conclusion:
Variables are critical components in C that store and manipulate data in the memory. They act
as named placeholders for memory regions, making identifying and retrieving stored data simple.
The syntax for creating a variable in C includes the following:
Following specific rules, such as starting with a letter, underscore, and avoiding reserved keywords,
ensures valid variable names. Variables can be declared without initialization or assigned an initial
value at the time of declaration. Once the variable is declared, variables can be used throughout the
program to store and manipulate data. They can be reassigned with new values as needed during
program execution.
Data Types in C
49 | P a g e
A data type specifies the type of data that a variable can store such as integer, floating, character, etc.
The memory size of the basic data types may change according to 32 or 64-bit operating system.
Let's see the basic data types. Its size is given according to 32-bit architecture.
50 | P a g e
Data Types Memory Size Range
float 4 byte
double 8 byte
51 | P a g e
long double 10 byte
Int:
Integers are entire numbers without any fractional or decimal parts, and the int data type is used to
represent them.
It is frequently applied to variables that include values, such as counts, indices, or other numerical
numbers. The int data type may represent both positive and negative numbers because it is signed by
default.
An int takes up 4 bytes of memory on most devices, allowing it to store values between around -2
billion and +2 billion.
Char:
Individual characters are represented by the char data type. Typically used to hold ASCII or UTF-8
encoding scheme characters, such as letters, numbers, symbols, or commas. There are 256
characters that can be represented by a single char, which takes up one byte of memory. Characters
such as 'A', 'b', '5', or '$' are enclosed in single quotes.
Float:
To represent integers, use the floating data type. Floating numbers can be used to represent fractional
units or numbers with decimal places.
The float type is usually used for variables that require very good precision but may not be very precise.
It can store values with an accuracy of about 6 decimal places and a range of about 3.4 x 1038 in 4
bytes of memory.
Double:
Use two data types to represent two floating integers. When additional precision is needed, such as in
scientific calculations or financial applications, it provides greater accuracy compared to float.
Double type, which uses 8 bytes of memory and has an accuracy of about 15 decimal places, yields
larger values. C treats floating point numbers as doubles by default if no explicit type is supplied.
Array:
An array, a derived data type, lets you store a sequence of fixed-size elements of the same type. It
provides a mechanism for joining multiple targets of the same data under the same name.
The index is used to access the elements of the array, with a 0 index for the first entry. The size of the
array is fixed at declaration time and cannot be changed during program execution. The array
components are placed in adjacent memory regions.
#include <stdio.h>
int main() {
int numbers[5]; // Declares an integer array with a size of 5 elements
Output:
Pointer:
A pointer is a derived data type that keeps track of another data type's memory address. When
a pointer is declared, the data type it refers to is stated first, and then the variable name is preceded
by an asterisk (*).
You can have incorrect access and change the value of variable using pointers by specifying the memory
address of the variable. Pointers are commonly used in tasks such as function pointers, data
structures, and dynamic memory allocation.
#include <stdio.h>
int main() {
int num = 42; // An integer variable
int *ptr; // Declares a pointer to an integer
Output:
Value of num: 42
Structure:
A structure is a derived data type that enables the creation of composite data types by allowing the
grouping of many data types under a single name. It gives you the ability to create your own unique
54 | P a g e
data structures by fusing together variables of various sorts.
1. A structure's members or fields are used to refer to each variable within it.
2. Any data type, including different structures, can be a member of a structure.
3. A structure's members can be accessed by using the dot (.) operator.
#include <stdio.h>
#include <string.h>
// Define a structure representing a person
struct Person {
char name[50];
int age;
float height;
};
Output:
55 | P a g e
Height: 1.80
Union:
A derived data type called a union enables you to store various data types in the same memory address.
In contrast to structures, where each member has a separate memory space, members of a union all
share a single memory space. A value can only be held by one member of a union at any given moment.
When you need to represent many data types interchangeably, unions come in handy. Like structures,
you can access the members of a union by using the dot (.) operator.
#include <stdio.h>
// Define a union representing a numeric value
union NumericValue {
int intValue;
float floatValue;
char stringValue[20];
};
int main() {
// Declare a variable of type union NumericValue
10. union NumericValue value;
11. // Assign a value to the union
12. value.intValue = 42;
13. // Accessing the union members
14. printf("Integer Value: %d\n", value.intValue);
15. // Assigning a different value to the union
16. value.floatValue = 3.14;
17. // Accessing the union members
18. printf("Float Value: %.2f\n", value.floatValue);
19.
20. return 0;
21. }
Output:
Integer Value: 42
Float Value: 3.14
#include <stdio.h>
Output:
Today is 2
Example:
ADVERTISEMENT
Example:
Example:
void* dataPtr;
The void data type is helpful for defining functions that don't accept any arguments when working with
generic pointers or when you wish to signal that a function doesn't return a value. It is significant to note
that while void* can be used to build generic pointers, void itself cannot be declared as a variable type.
Here is a sample of code that shows how to utilize void in various situations:
#include <stdio.h>
// Function with void return type
void printHello() {
printf("Hello, world!\n");
}
// Function with void parameter
void processInput(void) {
58 | P a g e
printf("Processing input...\n");
}
10.
11. int main() {
12. // Calling a void function
13. printHello();
14.
15. // Calling a function with void parameter
16. processInput();
17.
18. // Using a void pointer
19. int number = 10;
20. void* dataPtr = &number;
21. printf("Value of number: %d\n", *(int*)dataPtr);
22.
23. return 0;
24. }
Output:
Hello, world!
Processing input...
Value of number: 10
Conclusion:
As a result, data types are essential in the C programming language because they define the kinds of
information that variables can hold. They provide the data's size and format, enabling the compiler to
allot memory and carry out the necessary actions. Data types supported by C include void,
enumeration, derived, and basic types. In addition to floating-point types like float and double, basic
data types in C also include integer-based kinds like int, char, and short. These forms can
be signed or unsigned, and they fluctuate in size and range. To create dependable and efficient code, it
is crucial to comprehend the memory size and scope of these types.
A few examples of derived data types are unions, pointers, structures, and arrays. Multiple elements
of the same kind can be stored together in contiguous memory due to arrays. Pointers keep track of
memory addresses, allowing for fast data structure operations and dynamic memory allocation.
While unions allow numerous variables to share the same memory space, structures group relevant
variables together.
Code becomes more legible and maintainable when named constants are defined using enumeration
data types. Enumerations give named constants integer values to enable the meaningful representation
59 | P a g e
of related data. The void data type indicates the lack of a particular type. It is used as a return type for
both functions and function parameters that don't take any arguments and don't return a value.
The void* pointer also functions as a general pointer that can store addresses of various types.
C programming requires a solid understanding of data types. Programmers can ensure adequate
memory allocation, avoid data overflow or truncation, and enhance the readability and maintainability
of their code by selecting the right data type. C programmers may create effective, dependable, and
well-structured code that satisfies the requirements of their applications by having a firm understanding
of data types.
60 | P a g e
Keywords in C
Keywords in C are reserved words that have predefined meanings and are part of the C language syntax.
These keywords cannot be used as variable names, function names, or any other identifiers within the
program except for their intended purpose. They are used to define the structure flow and behavior of a C
program.
The compiler recognizes a defined set of keywords in the C programming language. These keywords
have specialized purposes and play critical roles in establishing the logic and behavior of a program. Here
are some characteristics of C keywords:
o Reserved: The C language reserves keywords are those keywords that cannot be used as identifiers in
programs. Using a keyword as a variable name or other identifier will cause a compilation error.
o Predefined Meaning: Each keyword has a specific meaning that is assigned by the C language. These
meanings are built into the C language's grammar and syntax and the compiler interprets them
accordingly.
o Specific Use: Keywords are designed for specific purposes and contexts within the C language. They
define control structures, data types, flow control, and other language constructs. Attempting to use
a keyword outside of its intended purpose will result in a compilation error.
o Standardized: C language keywords are standardized across different compilers and implementations.
It ensures the consistency and portability of C programs across different platforms and environments.
Here is a brief explanation of each keyword in the C language along with their syntax and an example:
Syntax:
Example:
Code:
1. #include <stdio.h>
2.
3. int main() {
4. auto int count = 10;
5. printf("Count: %d\n", count);
6.
7. {
8. auto int count = 5;
9. printf("Inner Count: %d\n", count);
10. }
11.
12. printf("Count: %d\n", count);
13.
14. return 0;
15. }
Output:
Count: 10
Inner Count: 5
Count: 10
Syntax:
ADVERTISEMENT
1. break;
Code:
1. #include <stdio.h>
62 | P a g e
2.
3. int main() {
4. for (inti = 0; i< 10; i++) {
5. if (i == 5) {
6. break;
7. }
8. printf("%d ", i);
9. }
10.
11. return 0;
12. }
Output:
0 1 2 3 4
Syntax:
1. case constant_expression:
Code:
1. #include <stdio.h>
2.
3. int main() {
4. int choice = 2;
5. switch (choice) {
6. case 1:
7. printf("You chose option 1.\n");
8. break;
9. case 2:
10. printf("You chose option 2.\n");
11. break;
12. default:
13. printf("Invalid choice.\n");
14. }
63 | P a g e
15.
16. return 0;
17. }
Output:
Syntax:
1. char variable_name;
Example:
Code:
#include <stdio.h>
int main() {
char grade = 'A';
printf("Grade: %c\n", grade);
return 0;
}
Output:
Grade: A
Syntax:
64 | P a g e
const data_type constant_name = value;
Code:
#include <stdio.h>
int main() {
constint MAX_SIZE = 100;
printf("Max Size: %d\n", MAX_SIZE);
return 0;
}
Output:
o continue: It is used to skip the remaining statements in a loop and continue with the next
iteration.
Syntax:
continue;
Code:
#include <stdio.h>
int main() {
for (inti = 0; i< 10; i++) {
if (i == 5) {
continue;
}
printf("%d ", i);
}
10.
11. return 0;
65 | P a g e
12. }
Output:
0 1 2 3 4 6 7 8 9
o default: It is used in a switch statement as the default case when no other cases match.
Syntax:
efault:
Code:
#include <stdio.h>
int main() {
int choice = 3;
switch (choice) {
case 1:
printf("You chose option 1.\n");
break;
case 2:
10. printf("You chose option 2.\n");
11. break;
12. default:
13. printf("Invalid choice.\n");
14. }
15.
16. return 0;
17. }
Output:
o do: It is used to create a do-while loop, which executes a block of code repeatedly until
a condition is met.
66 | P a g e
Syntax:
do {
// code to be executed
} while (condition);
Code:
#include <stdio.h>
int main() {
inti = 0;
do {
printf("%d ", i);
i++;
} while (i< 5);
10. return 0;
11. }
Output:
0 1 2 3 4
Syntax:
double variable_name;
Example:
ADVERTISEMENT
double pi = 3.14159;
Code:
67 | P a g e
#include <stdio.h>
int main() {
double pi = 3.14159;
printf("Pi: %lf\n", pi);
return 0;
}
Output:
Pi: 3.141590
o else: It is used in an if statement to specify the block of code to be executed when the condition
is false.
Syntax:
if (condition) {
// code to be executed if the condition is true
} else {
// code to be executed if the condition is false
}
Code:
#include <stdio.h>
int main() {
int age = 20;
if (age >= 18) {
printf("You are an adult.\n");
} else {
printf("You are not an adult.\n");
}
10.
11. return 0;
12. }
68 | P a g e
Output:
Syntax:
enum enum_name {
value1,
value2,
//...
};
Code:
#include <stdio.h>
enum Days {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
10. Sunday
11. };
12.
13. int main() {
14. enum Days today = Tuesday;
15. printf("Today is day number %d\n", today);
16.
17. return 0;
18. }
Output:
69 | P a g e
o extern: It is used to declare a variable or function that is defined in another file or external to
the current scope.
Syntax:
Code:
#include <stdio.h>
int main() {
global_variable = 10;
printf("Global variable: %d\n", global_variable);
return 0;
10. }
11.
12. int global_variable;
Output:
Global variable: 10
Syntax:
float variable_name;
Example:
Code:
70 | P a g e
#include <stdio.h>
int main() {
float weight = 65.5;
printf("Weight: %.2f\n", weight);
return 0;
}
Output:
ADVERTISEMENT
Weight: 65.50
o for: It is used to create a for loop, which repeatedly executes a block of code based on a specified
condition.
Syntax:
Example:
Code:
#include <stdio.h>
int main() {
for (inti = 0; i< 5; i++) {
printf("%d ", i);
}
printf("\n");
71 | P a g e
return 0;
10. }
Output:
0 1 2 3 4
o goto: It is used to transfer control to a labeled statement within the same function.
Syntax:
goto label_name;
Code:
#include <stdio.h>
int main() {
for (inti = 0; i< 10; i++) {
if (i == 5) {
goto end;
}
printf("%d ", i);
}
10.
11. end:
12. printf("Loop ended.\n");
13.
14. return 0;
15. }
Output:
0 1 2 3 4
Loop ended.
Syntax:
72 | P a g e
It has the following syntax:
if (condition) {
// code to be executed if the condition is true
}
Code:
#include <stdio.h>
int main() {
int x = 5;
if (x > 0) {
printf("x is a positive number.\n");
}
return 0;
10. }
Output:
x is a positive number.
Syntax:
int variable_name;
Example:
Code:
#include <stdio.h>
int main() {
int number = 10;
73 | P a g e
printf("Number: %d\n", number);
return 0;
}
Output:
Number: 10
Syntax:
long variable_name;
Example:
Code:
#include <stdio.h>
int main() {
long population = 1000000;
printf("Population: %ld\n", population);
return 0;
}
Output:
Population: 1000000
o register: It is used to declare a register variable, which suggests the compiler to store the
variable in a register for faster access.
Syntax:
74 | P a g e
register data_type variable_name;
Example:
register int x = 5;
Code:
#include <stdio.h>
int main() {
register intreg_var = 5;
printf("Register Variable: %d\n", reg_var);
return 0;
}
Output:
Register Variable: 5
o return: It is used to exit a function and return a value (if any) to the calling code.
Syntax:
return expression;
Code:
#include <stdio.h>
int square(intnum) {
return num * num;
}
intmain() {
int result = square(5);
printf("Square: %d\n", result);
10.
75 | P a g e
11. return 0;
12. }
Output:
Square: 25
Syntax:
short variable_name;
Code:
#include <stdio.h>
int main() {
short temperature = -10;
printf("Temperature: %d\n", temperature);
return 0;
}
Output:
Copy code
Temperature: -10
o signed: It is used to declare a signed data type, which can represent both positive and negative
values.
Syntax:
Example:
76 | P a g e
Code:
#include <stdio.h>
int main() {
signed int balance = -100;
printf("Balance: %d\n", balance);
return 0;
}
Output:
Balance: -100
Syntax:
sizeof(data_type); or sizeof(variable);
Code:
#include <stdio.h>
int main() {
int size = sizeof(int);
printf("Size of int: %d bytes\n", size);
return 0;
}
Output:
o static: It is used to declare a variable or function that retains its value or scope even after the
block in which it is defined has exited.
77 | P a g e
Syntax:
Code:
#include <stdio.h>
void increment() {
static int count = 0;
count++;
printf("Count: %d\n", count);
}
int main() {
10. increment();
11. increment();
12.
13. return 0;
14. }
Output:
Count: 1
Count: 2
o struct: It is used to define a user-defined data type called a structure, which can hold multiple
variables of different data types.
Syntax:
struct struct_name {
data_type member1;
data_type member2;
//...
78 | P a g e
};
Code:
#include <stdio.h>
#include <string.h>
struct Person {
char name[20];
int age;
};
int main() {
10. struct Person student;
11. strcpy(student.name, "John");
12. student.age = 20;
13. printf("Name: %s, Age: %d\n", student.name, student.age);
14.
15. return 0;
16. }
Output:
o switch: It is used to create a switch statement, which allows multiple execution paths based on
different cases.
Syntax:
switch (expression) {
case constant1:
// code to be executed if expression matches constant1
break;
case constant2:
// code to be executed if expression matches constant2
break;
//...
79 | P a g e
default:
10. // code to be executed if expression does not match any constant
11. }
Code:
#include <stdio.h>
int main() {
int choice = 2;
switch (choice) {
case 1:
printf("You chose option 1.\n");
break;
case 2:
10. printf("You chose option 2.\n");
11. break;
12. default:
13. printf("Invalid choice.\n");
14. }
15.
16. return 0;
17. }
Output:
o typedef: It is used to create a new name (alias) for an existing data type.
Syntax:
Code:
#include <stdio.h>
return 0;
10. }
Code:
Math Marks: 95
o union: It is used to define a user-defined data type called a union, which can hold different data
types but only one member at a time.
Code:
#include <stdio.h>
union Number {
int integer;
float floating_point;
};
int main() {
union Number num;
10. num.integer = 10;
11. printf("Integer: %d\n", num.integer);
12.
13. return 0;
14. }
Output:
Integer: 10
o unsigned: It is used to declare an unsigned data type, which can represent only positive
Syntax:
81 | P a g e
unsigned data_type variable_name;
Code:
#include <stdio.h>
int main() {
unsigned int count = 100;
printf("Count: %u\n", count);
return 0;
}
Output:
Count: 100
o void: This keyword is used to indicate the absence of a specific type or to define functions that
do not return a value.
Syntax:
Code:
#include <stdio.h>
void printMessage() {
printf("Hello, World!\n");
}
int main() {
printMessage();
10. return 0;
11. }
82 | P a g e
Output:
Hello, World!
o volatile: It is used to declare a variable that can be modified externally and should not be
optimized by the compiler.
Syntax:
Example:
Code:
#include <stdio.h>
int main() {
volatile int sensor_reading = 0;
Output:
Sensor Reading: 0
Sensor Reading: 1
Sensor Reading: 2
Sensor Reading: 3
Sensor Reading: 4
Sensor Reading: 5
Sensor Reading: 6
83 | P a g e
Sensor Reading: 7
Sensor Reading: 8
Sensor Reading: 9
o while: It is used to create a while loop, which repeatedly executes a block of code based on
a specified condition.
Syntax:
while (condition) {
// code to be executed
}
Code:
#include <stdio.h>
int main() {
inti = 0;
while (i< 5) {
printf("%d ", i);
i++;
}
printf("\n");
10.
11. return 0;
12. }
Output:
0 1 2 3 4
84 | P a g e
C Identifiers
C identifiers represent the name in the C program, for example, variables, functions, arrays, structures,
unions, labels, etc. An identifier can be composed of letters such as uppercase, lowercase letters,
underscore, digits, but the starting letter should be either an alphabet or an underscore. If the
identifier is not used in the external linkage, then it is called as an internal identifier. If the identifier is
used in the external linkage, then it is called as an external identifier.
We can say that an identifier is a collection of alphanumeric characters that begins either with an
alphabetical character or an underscore, which are used to represent various programming elements
such as variables, functions, arrays, structures, unions, labels, etc. There are 52 alphabetical characters
(uppercase and lowercase), underscore character, and ten numerical digits (0-9) that represent the
identifiers. There is a total of 63 alphanumerical characters that represent the identifiers.
ADVERTISEMENT
85 | P a g e
Types of identifiers
o Internal identifier
o External identifier
Internal Identifier
If the identifier is not used in the external linkage, then it is known as an internal identifier. The
internal identifiers can be local variables.
External Identifier
If the identifier is used in the external linkage, then it is known as an external identifier. The external
identifiers can be function names, global variables.
It must be written in a lowercase letter. It can be written in both lowercase and uppercase letters.
Its meaning is pre-defined in the c compiler. Its meaning is not defined in the c compiler.
It does not contain the underscore character. It can contain the underscore character.
1. int main()
2. {
3. int a=10;
4. int A=20;
5. printf("Value of a is : %d",a);
6. printf("\nValue of A is :%d",A);
7. return 0;
8. }
86 | P a g e
Output
Value of a is : 10
Value of A is :20
The above output shows that the values of both the variables, 'a' and 'A' are different. Therefore, we
conclude that the identifiers are case sensitive.
C Operators
An operator is simply a symbol that is used to perform operations. There can be many types of
operations like arithmetic, logical, bitwise, etc.
There are following types of operators to perform different types of operations in C language.
o Arithmetic Operators
87 | P a g e
o Relational Operators
o Shift Operators
o Logical Operators
o Bitwise Operators
o Ternary or Conditional Operators
o Assignment Operator
o Misc Operator
Precedence of Operators in C
The precedence of operator species that which operator will be evaluated first and next. The associativity
specifies the operator direction to be evaluated; it may be left to right or right to left.
ADVERTISEMENT
int value=10+20*10;
The value variable will contain 210 because * (multiplicative operator) is evaluated before + (additive
operator).
88 | P a g e
Equality == != Left to right
Arithmetic Operators:
Arithmetic operators carry out fundamental mathematical operations. The arithmetic operators in C
are as follows:
Addition Operator (+): The addition operator adds two operands together.
Syntax:
Example:
int a = 5;
int b = 3;
int result = a + b;
Output:
result = 8
89 | P a g e
Subtraction Operator (-): The second operand is subtracted from the first operand via the subtraction
operator.
Syntax:
Example:
int a = 8;
int b = 3;
int result = a - b;
Output:
result = 5
Multiplication Operator (*): This operator is used to multiply the two operands.
Syntax:
ADVERTISEMENT
Example:
int a = 4;
int b = 5;
int result = a * b;
Output:
result = 20
ADVERTISEMENT
ADVERTISEMENT
Division Operator (/): The first operand and the second operand are divided using the division
operator.
90 | P a g e
Syntax:
Example:
int a = 10;
int b = 2;
int result = a / b;
Output:
result = 5
Modulus Operator (%): The modulus operator determines the remainder of the division between two
operands.
Syntax:
Example:
int a = 10;
int b = 3;
int result = a % b;
Output:
result = 1
Relational Operators:
Relational operators assess the relationship between values by comparing them. They return
either true (1) or false (0). The relational operators in C are as follows:
Equality Operator (==): If two operands are equal, the equality operator verifies this.
Syntax:
91 | P a g e
It has the following syntax:
Example:
int a = 5;
int b = 5;
int result = a == b;
Output:
result=1 (true)
Inequality Operator (!=): The inequality operator determines whether two operands are equal or not.
Syntax:
ADVERTISEMENT
Example:
int a = 5;
int b = 3;
int result = a != b;
Output:
result=1 (true)
Greater than Operator (>): The greater than operator determines if the first operand exceeds the
second operand.
Syntax:
92 | P a g e
Example:
int a = 7;
int b = 4;
int result = a > b;
Output:
result=1 (true)
Less than Operator (<): The less-than operator determines if the first operand less is than the second
operand.
Syntax:
Example:
int a = 2;
int b = 6;
int result = a < b;
Output:
result=1 (true)
Greater than or Equal to Operator (>=): The greater than or equal to operator determines if the first
operand is more than or equal to the second operand.
Syntax:
Example:
int a = 5;
int b = 5;
int result = a >= b;
93 | P a g e
Output:
result=1 (true)
Less than or Equal To Operator (<=): The less than or equal to operator determines if the first
operand must be less than or equal to the second operand.
Syntax:
ADVERTISEMENT
Example:
int a = 3;
int b = 6;
int result = a <= b;
Output:
result=1 (true)
Shift Operators:
A binary number's bits can be moved to the left or right using shift operators. The C shift workers are
listed below:
Left Shift Operator (<<): The left shift operator moves the bits of the first operand to the left by the
number of places indicated by the second argument.
Syntax:
Example:
94 | P a g e
Output:
Right Shift Operator (>>): The right shift operator shifts the bits of the first operand to the right by
the number of positions specified by the second operand.
Syntax:
Example:
Output:
Logical Operators:
Logical operators perform logical operations on boolean values and return either true (1) or false
(0). Here are the logical operators in C:
Logical AND Operator (&&): The logical AND operator returns true if both operands are true.
Syntax:
Example:
int a = 5;
int b = 3;
int result = (a > 3) && (b < 5);
Output:
result = 1 (true)
95 | P a g e
Logical OR Operator (||): The logical OR operator returns true if at least one of the operands is true.
Syntax:
Example:
int a = 5;
int b = 3;
int result = (a > 3) || (b > 5);
Output:
result = 1 (true)
Logical NOT Operator (!): The logical NOT operator negates the value of the operand.
Syntax:
result = !operand;
Example:
int a = 5;
int result = !(a > 3);
Output:
result = 0 (false)
Bitwise Operators:
Bitwise operators perform operations on individual bits of the operands. Here are the bitwise operators
in C:
Bitwise AND Operator (&): The bitwise AND operator performs a bitwise AND operation on the
corresponding bits of the operands.
96 | P a g e
Syntax:
Example:
Output:
Bitwise OR Operator (|): The bitwise OR operator performs a bitwise OR operation on the
corresponding bits of the operands.
Syntax:
Example:
Output:
Bitwise XOR Operator (^): The bitwise XOR operator performs a bitwise exclusive OR operation on
the corresponding bits of the operands.
Syntax:
97 | P a g e
Example:
Output:
Bitwise NOT Operator (~): The bitwise NOT operator flips each bit of the operand.
Syntax:
result = ~operand;
Example:
Output:
Ternary or Conditional Operator: The ternary or conditional operator allows you to assign a value
based on a condition.
Syntax:
Example:
int a = 5;
int b = 3;
int result = (a > b) ? a : b;
98 | P a g e
Output:
result = 5
Assignment Operator:
Assignment operators are used to assign values to variables. Here is some of the assignment operator
in C:
Simple Assignment Operator (=): The simple assignment operator assigns the value from
the right side operands to the left side operands.
Syntax:
variable = value;
Example:
int a;
a = 5;
Output:
Miscellaneous Operator:
The sizeof operator and the comma operator fall under the miscellaneous operator category.
sizeof Operator: The sizeof operator returns the size, in bytes, of a variable or a data type.
Syntax:
Example:
int a;
int size = sizeof(a);
99 | P a g e
Output:
Comma Operator (,): The comma operator evaluates multiple expressions and returns the value of
the last expression.
Syntax:
makefileCopy code
result = (expression1, expression2,..., expressionN);
Example:
int a = 5, b = 3;
int result = (a += 2, b *= 2, a + b);
Output:
result = 15 // a = 7, b = 6, a + b = 13
Uses of Operators:
The following are some common uses for the various kinds of operators in C:
o Calculations in fundamental mathematics are performed using the addition and subtraction operators (+
and -).
o If the user wants to do some multiplication and division operations, utilize the multiplication and division
operators (* and /).
o The remainder of a division operation is obtained using the modulus operator (%).
o Equality and inequality operators (== and!=) are needed to compare values and determine whether
they are equal or not.
o Use the greater than and less than operators (>and <) to compare values and determine if one value
is larger than or less than
o A value's relationship to another value may be determined using the larger than or equal to and less
than or equal to operators (>= and <=).
o A binary number's bits are shifted to the left using the left shift operator (<<).
o A binary number's bits can be shifted to the right using the right shift operator (>>).
100 | P a g e
o Use the logical AND operator (&&) to combine many criteria and determine if each condition is true.
o When combining several criteria, the logical OR operator (||) is used to determine if at least one of the
conditions is true.
o The logical NOT operator (!) is used to negate a condition's value.
o When two numbers' individual bits are involved, the bitwise AND operator (&) is utilized to accomplish
the action.
o The bitwise OR operator (|) is employed when two numbers' individual bits are involved.
o Bitwise exclusive OR operator is performed on individual bits of two integers using the bitwise XOR
operator ().
o Use the bitwise NOT operator () to flip or invert the bits of an integer.
o Use the ternary operator (?:) to assign a value depending on a condition in a compact form.
o A value is assigned to a variable using the simple assignment operator (=).
o The sizeof operator is used to calculate a variable's or data type's size in bytes.
o When evaluating several expressions, the comma operator (,) returns the result of the last expression that
was evaluated.
Conclusion:
In this blog, we have covered the several types of C operators, such as arithmetic, relational, shift,
logical, bitwise, ternary, assignment, and other operators. We also covered their features, syntax,
samples, and what results to expect. By becoming proficient with these operators, you may effectively
handle data and write reliable C programs.
Comments in C
Comments in C language are used to provide information about lines of code. It is widely used for
documenting code. There are 2 types of comments in the C language.
101 | P a g e
2. Multi-Line Comments
1. #include<stdio.h>
2. int main(){
3. //printing information
4. printf("Hello C");
5. return 0;
6. }
Output:
Hello C
Even you can place the comment after the statement. For example:
1. /*
2. code
3. to be commented
4. */
1. #include<stdio.h>
2. int main(){
3. /*printing information
4. Multi-Line Comment*/
5. printf("Hello C");
6. return 0;
102 | P a g e
7. }
Output:
Hello C
C Format Specifier
The Format specifier is a string used in the formatted input and output functions. The format string
determines the format of the input and output. The format string always starts with a '%' character.
Format Description
specifier
103 | P a g e
%d or %i It is used to print the signed integer value where signed integer means that the variable can hold
both positive and negative values.
%u It is used to print the unsigned integer value where the unsigned integer means that the variable
can hold only positive value.
%o It is used to print the octal unsigned integer where octal integer value always starts with a 0
value.
%x It is used to print the hexadecimal unsigned integer where the hexadecimal integer value always
starts with a 0x value. In this, alphabetical characters are printed in small letters such as a, b, c,
etc.
%X It is used to print the hexadecimal unsigned integer, but %X prints the alphabetical characters in
uppercase such as A, B, C, etc.
%f It is used for printing the decimal floating-point values. By default, it prints the 6 values after '.'.
%g It is used to print the decimal floating-point values, and it uses the fixed precision, i.e., the value
after the decimal in input would be exactly the same as the value in the output.
ADVERTISEMENT
o %d
104 | P a g e
1. int main()
2. {
3. int b=6;
4. int c=8;
5. printf("Value of b is:%d", b);
6. printf("\nValue of c is:%d",c);
7.
8. return 0;
9. }
In the above code, we are printing the integer value of b and c by using the %d specifier.
ADVERTISEMENT
Output
o %u
1. int main()
2. {
3. int b=10;
4. int c= -10;
5. printf("Value of b is:%u", b);
6. printf("\nValue of c is:%u",c);
7.
8. return 0;
9. }
105 | P a g e
In the above program, we are displaying the value of b and c by using an unsigned format specifier,
i.e., %u. The value of b is positive, so %u specifier prints the exact value of b, but it does not print the
value of c as c contains the negative value.
Output
o %o
1. int main()
2. {
3. int a=0100;
4. printf("Octal value of a is: %o", a);
5. printf("\nInteger value of a is: %d",a);
6. return 0;
7. }
In the above code, we are displaying the octal value and integer value of a.
Output
106 | P a g e
o %x and %X
1. int main()
2. {
3. int y=0xA;
4. printf("Hexadecimal value of y is: %x", y);
5. printf("\nHexadecimal value of y is: %X",y);
6. printf("\nInteger value of y is: %d",y);
7. return 0;
8. }
In the above code, y contains the hexadecimal value 'A'. We display the hexadecimal value of y in two
formats. We use %x and %X to print the hexadecimal value where %x displays the value in small
letters, i.e., 'a' and %X displays the value in a capital letter, i.e., 'A'.
Output
o %f
107 | P a g e
1. int main()
2. {
3. float y=3.4;
4. printf("Floating point value of y is: %f", y);
5. return 0;
6. }
Output
o %e
1. int main()
2. {
3. float y=3;
4. printf("Exponential value of y is: %e", y);
5. return 0;
6. }
Output
108 | P a g e
o %E
1. int main()
2. {
3. float y=3;
4. printf("Exponential value of y is: %E", y);
5. return 0;
6. }
Output
o %g
1. int main()
2. {
3. float y=3.8;
4. printf("Float value of y is: %g", y);
5. return 0;
6. }
109 | P a g e
In the above code, we are displaying the floating value of y by using %g specifier. The %g specifier
displays the output same as the input with a same precision.
Output
ADVERTISEMENT
ADVERTISEMENT
o %p
1. int main()
2. {
3. int y=5;
4. printf("Address value of y in hexadecimal form is: %p", &y);
5. return 0;
6. }
Output
o %c
110 | P a g e
1. int main()
2. {
3. char a='c';
4. printf("Value of a is: %c", a);
5. return 0;
6. }
Output
o %s
1. int main()
2. {
3. printf("%s", "javaTpoint");
4. return 0;
5. }
Output
111 | P a g e
Minimum Field Width Specifier
Suppose we want to display an output that occupies a minimum number of spaces on the screen. You
can achieve this by displaying an integer number after the percent sign of the format specifier.
1. int main()
2. {
3. int x=900;
4. printf("%8d", x);
5. printf("\n%-8d",x);
6. return 0;
7. }
In the above program, %8d specifier displays the value after 8 spaces while %-8d specifier will make a
value left-aligned.
Output
112 | P a g e
Now we will see how to fill the empty spaces. It is shown in the below code:
1. int main()
2. {
3. int x=12;
4. printf("%08d", x);
5. return 0;
6. }
In the above program, %08d means that the empty space is filled with zeroes.
Output
Specifying Precision
We can specify the precision by using '.' (Dot) operator which is followed by integer and format
specifier.
113 | P a g e
1. int main()
2. {
3. float x=12.2;
4. printf("%.2f", x);
5. return 0;
6. }
Output
Escape Sequence in C
Programming languages like C have escape sequences as a standard feature. They enable the
inclusion of special characters and control patterns in strings and character constants that are
difficult to represent or write directly. In this blog post, we will explore escape sequences in C,
their syntax, usage, and examples with matching outputs. Therefore, let's start this adventure to
understanding escape sequences in C.
An escape sequence in the C programming language consists of a backslash () and a character that
stands in for a special character or control sequence. During the compilation process, the C
compiler substitutes any escape sequences it comes across with the relevant character or control
sequence. It enables the use of difficult-to-represent characters like newlines, tabs, quotations, and
backslashes.
It is composed of two or more characters starting with backslash \. For example: \n represents new
line.
114 | P a g e
Regular Escape Sequences:
There are several escape sequence in C programming languages.
ADVERTISEMENT
\a Alarm or Beep
\b Backspace
\f Form Feed
\n New Line
\r Carriage Return
\t Tab (Horizontal)
\v Vertical Tab
\\ Backslash
\? Question Mark
\0 Null
115 | P a g e
Alarm or Beep (\a):
The alarm or beep escape sequence (a) produces an audible alert or beep sound.
1. #include <stdio.h>
2.
3. int main() {
4. printf("This is an alarm sound: \a");
5.
6. return 0;
7. }
Output:
Backspace (\b):
The cursor can be advanced by one character with the backspace escape key (b).
1. #include <stdio.h>
2.
3. int main() {
4. printf("Hello\b\b\bWorld!");
5.
6. return 0;
7. }
Output:
HelloWorld!
1. #include <stdio.h>
2.
3. int main() {
4. printf("This is before the form feed.\fThis is after the form feed.");
5.
6. return 0;
116 | P a g e
7. }
Output:
1. #include <stdio.h>
2.
3. int main() {
4. printf("Line 1\nLine 2");
5.
6. return 0;
7. }
Output:
Line 1
Line 2
1. #include <stdio.h>
2.
3. int main() {
4. printf("Hello\rWorld!");
5.
6. return 0;
7. }
Output:
World!
117 | P a g e
Tab (Horizontal) (\t):
The tab escape sequence (t) is used to insert a horizontal tab character and shift the cursor to the
following tab stop.
1. #include <stdio.h>
2.
3. int main() {
4. printf("Name:\tJohn\tAge:\t25");
5.
6. return 0;
7. }
Output:
1. #include <stdio.h>
2.
3. int main() {
4. printf("Hello\vWorld!");
5.
6. return 0;
7. }
Output:
Hello
World!
Backslash (\):
A backslash character is inserted using the backslash escape sequence (\).
1. #include <stdio.h>
2.
3. int main() {
4. printf("This is a backslash: \\Hello");
118 | P a g e
5.
6. return 0;
7. }
Output:
1. #include <stdio.h>
2.
3. int main() {
4. printf("This is a single quote: \'Hello\'");
5.
6. return 0;
7. }
ADVERTISEMENT
ADVERTISEMENT
Output:
1. #include <stdio.h>
2.
3. int main() {
4. printf("This is a double quote: \"Hello\"");
5.
6. return 0;
7. }
Output:
119 | P a g e
Question Mark (?):
The question mark escape sequence (?) is used to insert a question mark character.
1. #include <stdio.h>
2.
3. int main() {
4. printf("This is a question mark: \?");
5.
6. return 0;
7. }
Output:
1. #include <stdio.h>
2.
3. int main() {
4. printf("This is an octal value: \101");
5.
6. return 0;
7. }
Output:
1. #include <stdio.h>
2.
3. int main() {
4. printf("This is a hexadecimal value: \x41");
5.
120 | P a g e
6. return 0;
7. }
Output:
Null (\0):
The null character, denoted by "0", is inserted using the null escape sequence (0).
1. #include <stdio.h>
2. int main() {
3. char myString[] = "Hello\0World!";
4. printf("String: %s", myString);
5.
6. return 0;
7. }
Output:
String: Hello
Conclusion:
In conclusion, escape sequences are a crucial component of C programming that enables us to
successfully handle special characters and control sequences. We may put characters into strings
and character variables that are challenging to directly express using escape sequences.
121 | P a g e
122 | P a g e
ASCII value in C
What is ASCII code?
The full form of ASCII is the American Standard Code for information interchange. It is a character
encoding scheme used for electronics communication. Each character or a special character is
represented by some ASCII code, and each ascii code occupies 7 bits in memory.
In C programming language, a character variable does not contain a character value itself rather the
ascii value of the character variable. The ascii value represents the character variable in numbers, and
each character variable is assigned with some number range from 0 to 127. For example, the ascii
value of 'A' is 65.
123 | P a g e
In the above example, we assign 'A' to the character variable whose ascii value is 65, so 65 will be
stored in the character variable rather than 'A'.
ADVERTISEMENT
We will create a program which will display the ascii value of the character variable.
1. #include <stdio.h>
2. int main()
3. {
4. char ch; // variable declaration
5. printf("Enter a character");
6. scanf("%c",&ch); // user input
7. printf("\n The ascii value of the ch variable is : %d", ch);
8. return 0;
9. }
In the above code, the first user will give the character input, and the input will get stored in the 'ch'
variable. If we print the value of the 'ch' variable by using %c format specifier, then it will display 'A'
because we have given the character input as 'A', and if we use the %d format specifier then its ascii
value will be displayed, i.e., 65.
Output
The above output shows that the user gave the input as 'A', and after giving input, the ascii value of
'A' will get printed, i.e., 65.
Now, we will create a program which will display the ascii value of all the characters.
1. #include <stdio.h>
124 | P a g e
2. int main()
3. {
4. int k; // variable declaration
5. for(int k=0;k<=255;k++) // for loop from 0-255
6. {
7. printf("\nThe ascii value of %c is %d", k,k);
8. }
9. return 0;
10. }
The above program will display the ascii value of all the characters. As we know that ascii value of all
the characters starts from 0 and ends at 255, so we iterate the for loop from 0 to 255.
Now we will create the program which will sum the ascii value of a string.
1. #include <stdio.h>
2. int main()
3. {
4. int sum=0; // variable initialization
5. char name[20]; // variable initialization
6. int i=0; // variable initialization
7. printf("Enter a name: ");
8. scanf("%s", name);
9. while(name[i]!='\0') // while loop
10. {
11. printf("\nThe ascii value of the character %c is %d", name[i],name[i]);
12. sum=sum+name[i];
13. i++;
14. }
15. printf("\nSum of the ascii value of a string is : %d", sum);
16. return 0;
17. }
In the above code, we are taking user input as a string. After taking user input, we execute
the while loop which adds the ascii value of all the characters of a string and stores it in a 'sum'
variable.
Output
125 | P a g e
Constants in C
In programming languages like C, constants are essential because they give you a mechanism to
store unchanging values that hold true throughout the course of the program. These numbers may
be used for several things, such as creating mathematical constants or giving variables set values.
We will discuss the idea of constants in C, their syntax, how to declare and use them and give
illustrated examples along with their anticipated results in this blog article. By the end of this article,
you'll have a firm grasp of constants and their importance in C programming.
126 | P a g e
A constant in C is a value that doesn't change as the program runs. Integers, floating-point
numbers, characters, and strings are just a few of the several types of constants that may be
employed. When a constant has a value, it cannot be changed, unlike variables. They may be utilized
in various operations and computations and serve as the program's representation of fixed values.
127 | P a g e
Advantages of C Constants:
There are several advantages of C Constants. Some main advantages of C Constants are as follows:
1. Programmers may use constants to provide names that have meaning to fixed numbers, which makes the
code simpler to comprehend and update.
2. Constants assist in avoiding the usage of magic numbers, which are hard-coded values, in the code.
Instead, constants offer named representations of such values, enhancing the code's readability.
3. Constants are reusable throughout the program, allowing for constant values in various locations and
lowering the possibility of errors brought on by typos or inconsistent values.
4. Calculations or processes inside the program can be optimized by using certain constants, such as
mathematical or physical constants.
5. A constant is a value or variable that can't be changed in the program, for example: 10, 20, 'a', 3.4, "c
programming", etc.
ADVERTISEMENT
List of Constants in C
Constant Example
128 | P a g e
There are two ways to define constant in C programming.
1. const keyword
2. #define preprocessor
1) C const keyword
The const keyword is used to define constant in C programming.
#include<stdio.h>
int main(){
const float PI=3.14;
printf("The value of PI is: %f",PI);
return 0;
}
Output:
If you try to change the the value of PI, it will render compile time error.
#include<stdio.h>
int main(){
const float PI=3.14;
PI=4.5;
printf("The value of PI is: %f",PI);
return 0;
}
Output:
2) C #define preprocessor
129 | P a g e
The #define preprocessor is also used to define constant. We will learn about #define preprocessor
directive.
Types of constant:
There are different types of Constants in C. Some of them are as follows:
Decimal Constant
A whole number represented in base 10 is known as a decimal constant. It has digits that range
from 0 to 9. Declaring a decimal constant has a simple syntax that just requires the value to be written.
Example:
#include <stdio.h>
int main() {
int decimal = 42;
printf("The decimal constant is: %d\n", decimal);
return 0;
}
Output:
Example:
ADVERTISEMENT
ADVERTISEMENT
#include <stdio.h>
int main() {
float real = 3.14;
printf("The real constant is: %f\n", real);
130 | P a g e
return 0;
}
Output:
Octal Constant:
A base 8 value is represented by an octal constant. It is prefixed with a '0' (zero) to show that it is an
octal constant and has digits ranging from 0 to 7.
Example:
#include <stdio.h>
int main() {
int octal = 052; // Octal representation of decimal 42
printf("The octal constant is: %o\n", octal);
return 0;
}
Output:
Hexadecimal Constant:
A base-16 value is represented by a hexadecimal constant. It uses letters A to F (or a to f) and
numbers 0 to 9 to represent values from 10 to 15. It is prefixed with '0x' or '0X' to identify it as a
hexadecimal constant.
Example:
#include <stdio.h>
int main() {
int hexadecimal = 0x2A; // Hexadecimal representation of decimal 42
printf("The hexadecimal constant is: %x\n", hexadecimal);
return 0;
}
131 | P a g e
Output:
Character Constant
A character constant represents a single character that is enclosed in single quotes.
Example:
#include <stdio.h>
int main() {
char character = 'A';
printf("The character constant is: %c\n", character);
return 0;
}
Output:
String Constant:
A series of characters wrapped in double quotes is represented by a string constant. It is a character
array that ends with the null character \0.
Example:
#include <stdio.h>
int main() {
char string[] = "Hello, World!";
printf("The string constant is: %s\n", string);
return 0;
}
Output:
Integer Constants:
1. The digits of an integer constant can range from 0 to 9.
2. A decimal point should not be present in an integer constant.
3. Positive or negative integer constants are also possible.
4. You can add a suffix to a constant's name to define its type. 'U' or 'u' stands for unsigned,
'L' or 'l' for long, or 'LL' or 'll' for long long.
Floating-Point Constants:
1. A decimal point, an exponent, or digits can all be found in floating-point constants.
2. Either exponential notation or decimal notation can be used to write them.
3. 'E' or 'e' can be used to denote an exponent.
4. You can add a suffix to a constant's name to define its type. For instance, "F" or "f" stands
for float and "L" or "l" for long double.
Octagonal Constants
1. Base 8 is used for writing octal constants.
2. They are made up of the numerals 0 through 7.
3. A '0' (zero) should come before any octal constants.
Hexadecimal Constants:
1. Constants in hexadecimal are expressed in base 16.
2. To represent numbers from 10 to 15, they are made up of numerals 0 to 9 and letters A to F (or a to f).
3. Prefixing a hexadecimal constant with '0x' or '0X' is appropriate.
Character Constants:
1. Individual characters are represented as character constants when they are in single quotes.
2. A single letter or an escape sequence, such as "n" for newline or "t" for tab, can be used as these
characters.
String Constants:
133 | P a g e
1. A series of characters surrounded in double quotes is represented by string constants.
2. They are essentially character arrays that are closed with the null character "0".
Conclusion:
As a result of their representation of fixed values that don't change during the course of the program,
constants are crucial in C programming. By following the rules for making constants, programmers may
create reliable and practical representations of data in their programs.
As constants may be used and referenced several times throughout the program, using them in C
programs also increases code reuse. When utilizing the same value again, it assures consistency and
lessens the possibility of adding errors or mistakes.
Constants can also improve computations and processes, particularly when physical or mathematical
constants are involved. Programmers can create code that is more effective and optimized by utilizing
constants rather than hard-coding variables
134 | P a g e
135 | P a g e
Advantages of C Constants:
There are several advantages of C Constants. Some main advantages of C Constants are as follows:
1. Programmers may use constants to provide names that have meaning to fixed numbers, which makes the
code simpler to comprehend and update.
2. Constants assist in avoiding the usage of magic numbers, which are hard-coded values, in the code.
Instead, constants offer named representations of such values, enhancing the code's readability.
3. Constants are reusable throughout the program, allowing for constant values in various locations and
lowering the possibility of errors brought on by typos or inconsistent values.
4. Calculations or processes inside the program can be optimized by using certain constants, such as
mathematical or physical constants.
5. A constant is a value or variable that can't be changed in the program, for example: 10, 20, 'a', 3.4, "c
programming", etc.
ADVERTISEMENT
List of Constants in C
Constant Example
136 | P a g e
There are two ways to define constant in C programming.
1. const keyword
2. #define preprocessor
1) C const keyword
The const keyword is used to define constant in C programming.
#include<stdio.h>
int main(){
const float PI=3.14;
printf("The value of PI is: %f",PI);
return 0;
}
Output:
If you try to change the the value of PI, it will render compile time error.
#include<stdio.h>
int main(){
const float PI=3.14;
PI=4.5;
printf("The value of PI is: %f",PI);
return 0;
}
Output:
2) C #define preprocessor
137 | P a g e
The #define preprocessor is also used to define constant. We will learn about #define preprocessor
directive.
Types of constant:
There are different types of Constants in C. Some of them are as follows:
Decimal Constant
A whole number represented in base 10 is known as a decimal constant. It has digits that range
from 0 to 9. Declaring a decimal constant has a simple syntax that just requires the value to be written.
Example:
#include <stdio.h>
int main() {
int decimal = 42;
printf("The decimal constant is: %d\n", decimal);
return 0;
}
Output:
Example:
#include <stdio.h>
int main() {
float real = 3.14;
printf("The real constant is: %f\n", real);
return 0;
}
138 | P a g e
Output:
Octal Constant:
A base 8 value is represented by an octal constant. It is prefixed with a '0' (zero) to show that it is an
octal constant and has digits ranging from 0 to 7.
Example:
#include <stdio.h>
int main() {
int octal = 052; // Octal representation of decimal 42
printf("The octal constant is: %o\n", octal);
return 0;
}
Output:
Hexadecimal Constant:
A base-16 value is represented by a hexadecimal constant. It uses letters A to F (or a to f) and
numbers 0 to 9 to represent values from 10 to 15. It is prefixed with '0x' or '0X' to identify it as a
hexadecimal constant.
Example:
#include <stdio.h>
int main() {
int hexadecimal = 0x2A; // Hexadecimal representation of decimal 42
printf("The hexadecimal constant is: %x\n", hexadecimal);
return 0;
}
Output:
139 | P a g e
Character Constant
A character constant represents a single character that is enclosed in single quotes.
Example:
#include <stdio.h>
int main() {
char character = 'A';
printf("The character constant is: %c\n", character);
return 0;
}
Output:
String Constant:
A series of characters wrapped in double quotes is represented by a string constant. It is a character
array that ends with the null character \0.
Example:
#include <stdio.h>
int main() {
char string[] = "Hello, World!";
printf("The string constant is: %s\n", string);
return 0;
}
Output:
140 | P a g e
guidelines for creating constants in C are as follows:
Integer Constants:
1. The digits of an integer constant can range from 0 to 9.
2. A decimal point should not be present in an integer constant.
3. Positive or negative integer constants are also possible.
4. You can add a suffix to a constant's name to define its type. 'U' or 'u' stands for unsigned,
'L' or 'l' for long, or 'LL' or 'll' for long long.
Floating-Point Constants:
1. A decimal point, an exponent, or digits can all be found in floating-point constants.
2. Either exponential notation or decimal notation can be used to write them.
3. 'E' or 'e' can be used to denote an exponent.
4. You can add a suffix to a constant's name to define its type. For instance, "F" or "f" stands
for float and "L" or "l" for long double.
Octagonal Constants
1. Base 8 is used for writing octal constants.
2. They are made up of the numerals 0 through 7.
3. A '0' (zero) should come before any octal constants.
Hexadecimal Constants:
1. Constants in hexadecimal are expressed in base 16.
2. To represent numbers from 10 to 15, they are made up of numerals 0 to 9 and letters A to F (or a to f).
3. Prefixing a hexadecimal constant with '0x' or '0X' is appropriate.
Character Constants:
1. Individual characters are represented as character constants when they are in single quotes.
2. A single letter or an escape sequence, such as "n" for newline or "t" for tab, can be used as these
characters.
String Constants:
1. A series of characters surrounded in double quotes is represented by string constants.
141 | P a g e
2. They are essentially character arrays that are closed with the null character "0".
Conclusion:
As a result of their representation of fixed values that don't change during the course of the program,
constants are crucial in C programming. By following the rules for making constants, programmers may
create reliable and practical representations of data in their programs.
As constants may be used and referenced several times throughout the program, using them in C
programs also increases code reuse. When utilizing the same value again, it assures consistency and
lessens the possibility of adding errors or mistakes.
Constants can also improve computations and processes, particularly when physical or mathematical
constants are involved. Programmers can create code that is more effective and optimized by utilizing
constants rather than hard-coding variables.
142 | P a g e
What are literals?
Literals are the constant values assigned to the constant variables. We can say that the literals
represent the fixed values that cannot be modified. It also contains memory but does not have
references as variables. For example, const int =10; is a constant integer expression in which 10 is an
integer literal.
Types of literals
There are four types of literals that exist in C programming:
o Integer literal
o Float literal
o Character literal
o String literal
Integer literal
It is a numeric literal that represents only integer type values. It represents the value neither in
fractional nor exponential part.
It is defined by representing the digits between 0 to 9. For example, 45, 67, etc.
ADVERTISEMENT
143 | P a g e
Octal number (base 8)
It is defined as a number in which 0 is followed by digits such as 0,1,2,3,4,5,6,7. For example, 012, 034,
055, etc.
It is defined as a number in which 0x or 0X is followed by the hexadecimal digits (i.e., digits from 0 to
9, alphabetical characters from (a-z) or (A-Z)).
L or l: It is a size qualifier that specifies the size of the integer type as long.
U or u: It is a sign qualifier that represents the type of the integer as unsigned. An unsigned qualifier
contains only positive values.
Note: The order of the qualifier is not considered, i.e., both lu and ul are the same.
1. #include <stdio.h>
2. int main()
3. {
4. const int a=23; // constant integer literal
5. printf("Integer literal : %d", a);
6. return 0;
7. }
Output
Integer literal : 23
Float literal
It is a literal that contains only floating-point values or real numbers. These real numbers contain the
number of parts such as integer part, real part, exponential part, and fractional part. The floating-
point literal must be specified either in decimal or in exponential form. Let's understand these forms
in brief.
144 | P a g e
Decimal form
The decimal form must contain either decimal point, exponential part, or both. If it does not contain
either of these, then the compiler will throw an error. The decimal notation can be prefixed either by
'+' or '-' symbol that specifies the positive and negative numbers.
1. #include <stdio.h>
2. int main()
3. {
4. const float a=4.5; // constant float literal
5. const float b=5.6; // constant float literal
6. float sum;
7. sum=a+b;
8. printf("%f", sum);
9. return 0;
10. }
Output
10.100000
Exponential form
The exponential form is useful when we want to represent the number, which is having a big
magnitude. It contains two parts, i.e., mantissa and exponent. For example, the number is
2340000000000, and it can be expressed as 2.34e12 in an exponential form.
ADVERTISEMENT
ADVERTISEMENT
145 | P a g e
Rules for creating an exponential notation
The following are the rules for creating a float literal in exponential notation:
o In exponential notation, the mantissa can be specified either in decimal or fractional form.
o An exponent can be written in both uppercase and lowercase, i.e., e and E.
o We can use both the signs, i.e., positive and negative, before the mantissa and exponent.
o Spaces are not allowed
Character literal
A character literal contains a single character enclosed within single quotes. If multiple characters are
assigned to the variable, then we need to create a character array. If we try to store more than one
character in a variable, then the warning of a multi-character character constant will be generated.
Let's observe this scenario through an example.
1. #include <stdio.h>
2. int main()
3. {
4. const char c='ak';
5. printf("%c",c);
6. return 0;
7. }
ADVERTISEMENT
ADVERTISEMENT
In the above code, we have used two characters, i.e., 'ak', within single quotes. So, this statement will
generate a warning as shown below.
Warning generated:
o It can be represented by specifying a single character within single quotes. For example, 'a', 'b', etc.
o We can specify the escape sequence character within single quotes to represent a character literal. For
example, '\n', '\a', '\b'.
o We can also use the ASCII in integer to represent a character literal. For example, the ascii value of 65 is
'A'.
o The octal and hexadecimal notation can be used as an escape sequence to represent a character literal.
For example, '\023', '\0x12'.
String literal
A string literal represents multiple characters enclosed within double-quotes. It contains an additional
character, i.e., '\0' (null character), which gets automatically inserted. This null character specifies the
termination of the string. We can use the '+' symbol to concatenate two strings.
For example,
String1= "javatpoint";
String2= "family";
To concatenate the above two strings, we use '+' operator, as shown in the below statement:
Note: If we represent a single character, i.e., 'b', then this character will occupy a single byte as it
is a character literal. And, if we represent the character within double quotes "b" then it will
occupy more bytes as it is a string literal.
147 | P a g e
Tokens in C
Tokens in C is the most important element to be used in creating a program in C. We can define the
token as the smallest individual element in C. For `example, we cannot create a sentence without
using words; similarly, we cannot create a program in C without using tokens in C. Therefore, we can
say that tokens in C is the building block or the basic component for creating a program in C
language.
Classification of tokens in C
148 | P a g e
o Keywords in C
o Identifiers in C
o Strings in C
o Operators in C
o Constant in C
o Special Characters in C
Keywords in C
Keywords in C can be defined as the pre-defined or the reserved words having its own importance,
and each keyword has its own functionality. Since keywords are the pre-defined words used by the
compiler, so they cannot be used as the variable names. If the keywords are used as the variable
names, it means that we are assigning a different meaning to the keyword, which is not allowed. C
language supports 32 keywords given below:
149 | P a g e
const float short unsigned
do if static while
Identifiers in C
Identifiers in C are used for naming variables, functions, arrays, structures, etc. Identifiers in C are the
user-defined words. It can be composed of uppercase letters, lowercase letters, underscore, or digits,
but the starting letter should be either an underscore or an alphabet. Identifiers cannot be used as
keywords. Rules for constructing identifiers in C are given below:
o The first character of an identifier should be either an alphabet or an underscore, and then it can be
followed by any of the character, digit, or underscore.
o It should not begin with any numerical digit.
o In identifiers, both uppercase and lowercase letters are distinct. Therefore, we can say that identifiers are
case sensitive.
o Commas or blank spaces cannot be specified within an identifier.
o Keywords cannot be represented as an identifier.
o The length of the identifiers should not be more than 31 characters.
o Identifiers should be written in such a way that it is meaningful, short, and easy to read.
Strings in C
Strings in C are always represented as an array of characters having null character '\0' at the end of
the string. This null character denotes the end of the string. Strings in C are enclosed within double
quotes, while characters are enclosed within single characters. The size of a string is a number of
characters that the string contains.
char a[10] = "javatpoint"; // The compiler allocates the 10 bytes to the 'a' array.
char a[] = "javatpoint"; // The compiler allocates the memory at the run time.
150 | P a g e
Operators in C
Operators in C is a special symbol used to perform the functions. The data items on which the
operators are applied are known as operands. Operators are applied between the operands.
Depending on the number of operands, operators are classified as follows:
Unary Operator
A unary operator is an operator applied to the single operand. For example: increment operator (++),
decrement operator (--), sizeof, (type)*.
Binary Operator
The binary operator is an operator applied between two operands. The following is the list of the
binary operators:
o Arithmetic Operators
o Relational Operators
o Shift Operators
o Logical Operators
o Bitwise Operators
o Conditional Operators
o Assignment Operator
o Misc Operator
Constants in C
A constant is a value assigned to the variable which will remain the same throughout the program, i.e.,
the constant value cannot be changed.
Types of constants in C
Constant Example
151 | P a g e
Floating-point constant 45.6, 67.8, 11.2, etc.
Special characters in C
Some special characters are used in C, and they have a special meaning which cannot be used for
another purpose.
o Square brackets [ ]: The opening and closing brackets represent the single and multidimensional
subscripts.
o Simple brackets ( ): It is used in function declaration and function calling. For example, printf() is a pre-
defined function.
o Curly braces { }: It is used in the opening and closing of the code. It is used in the opening and closing
of the loops.
o Comma (,): It is used for separating for more than one statement and for example, separating function
parameters in a function call, separating the variable when printing the value of more than one variable
using a single printf statement.
o Hash/pre-processor (#): It is used for pre-processor directive. It basically denotes that we are using the
header file.
o Asterisk (*): This symbol is used to represent pointers and also used as an operator for multiplication.
o Tilde (~): It is used as a destructor to free memory.
o Period (.): It is used to access a member of a structure or a union.
152 | P a g e
C Boolean
In C, Boolean is a data type that contains two types of values, i.e., 0 and 1. Basically, the bool type value
represents two types of behavior, either true or false. Here, '0' represents false value, while '1' represents
true value.
In C Boolean, '0' is stored as 0, and another integer is stored as 1. We do not require to use any header
file to use the Boolean data type in C++, but in C, we have to use the header file, i.e., stdbool.h. If we do
not use the header file, then the program will not compile.
Syntax
bool variable_name;
In the above syntax, bool is the data type of the variable, and variable_name is the name of the variable.
ADVERTISEMENT
#include <stdio.h>
#include<stdbool.h>
int main()
{
bool x=false; // variable initialization.
if(x==true) // conditional statements
{
printf("The value of x is true");
}
10. else
11. printf("The value of x is FALSE");
12. return 0;
13. }
In the above code, we have used <stdbool.h> header file so that we can use the bool type variable in
our program. After the declaration of the header file, we create the bool type variable 'x' and assigns a
'false' value to it. Then, we add the conditional statements, i.e., if..else, to determine whether the value
of 'x' is true or not.
Output
153 | P a g e
Boolean Array
Now, we create a bool type array. The Boolean array can contain either true or false value, and the values
of the array can be accessed with the help of indexing.
#include <stdio.h>
#include<stdbool.h>
int main()
{
bool b[2]={true,false}; // Boolean type array
for(int i=0;i<2;i++) // for loop
{
printf("%d,",b[i]); // printf statement
}
10. return 0;
11. }
In the above code, we have declared a Boolean type array containing two values, i.e., true and false.
Output
1,0,
typedef
There is another way of using Boolean value, i.e., typedef. Basically, typedef is a keyword in C language,
which is used to assign the name to the already existing datatype.
#include <stdio.h>
typedef enum{false,true} b;
int main()
{
b x=false; // variable initialization
if(x==true) // conditional statements
{
printf("The value of x is true");
}
154 | P a g e
10. else
11. {
12. printf("The value of x is false");
13. }
14. return 0;
15. }
In the above code, we use the Boolean values, i.e., true and false, but we have not used the bool type.
We use the Boolean values by creating a new name of the 'bool' type. In order to achieve this, the
typedef keyword is used in the program.
typedef enum{false,true} b;
The above statement creates a new name for the 'bool' type, i.e., 'b' as 'b' can contain either true or false
value. We use the 'b' type in our program and create the 'x' variable of type 'b'.
Output
&&(AND Operator): It is a logical operator that takes two operands. If the value of both the operands
are true, then this operator returns true otherwise false
||(OR Operator): It is a logical operator that takes two operands. If the value of both the operands is
false, then it returns false otherwise true.
!(NOT Operator): It is a NOT operator that takes one operand. If the value of the operand is false, then
it returns true, and if the value of the operand is true, then it returns false.
#include <stdio.h>
#include<stdbool.h>
int main()
{
bool x=false;
bool y=true;
155 | P a g e
printf("The value of x&&y is %d", x&&y);
printf("\nThe value of x||y is %d", x||y);
printf("\nThe value of !x is %d", !x);
10. }
Output
156 | P a g e
157 | P a g e
Static in C
Static is a keyword used in C programming language. It can be used with both variables and
functions, i.e., we can declare a static variable and static function as well. An ordinary variable is
limited to the scope in which it is defined, while the scope of the static variable is throughout the
program.
1. #include <stdio.h>
2. int main()
3. {
4. printf("%d",func());
158 | P a g e
5. printf("\n%d",func());
6. return 0;
7. }
8. int func()
9. {
10. int count=0; // variable initialization
11. count++; // incrementing counter variable
12.
13. return count; }
In the above code, the func() function is called. In func(), count variable gets updated. As soon as the
function completes its execution, the memory of the count variable will be removed. If we do not
want to remove the count from memory, then we need to use the count variable as static. If we
declare the variable as static, then the variable will not be removed from the memory even when the
function completes its execution.
Output
ADVERTISEMENT
1
1
Static variable
A static variable is a variable that persists its value across the various function calls.
Syntax
1. #include <stdio.h>
2. int main()
3. {
4. printf("%d",func());
5. printf("\n%d",func());
6.
7. return 0;
8. }
159 | P a g e
9. int func()
10. {
11. static int count=0;
12. count++;
13. return count;
14. }
In the above code, we have declared the count variable as static. When the func() is called, the value
of count gets updated to 1, and during the next function call, the value of the count variable becomes
2. Therefore, we can say that the value of the static variable persists within the function call.
Output
1
2
Static Function
As we know that non-static functions are global by default means that the function can be accessed
outside the file also, but if we declare the function as static, then it limits the function scope. The static
function can be accessed within a file only.
Static variables are limited to the source file in which they are defined, i.e., they are not accessible by
the other source files.
Both the static and global variables have static initialization. Here, static initialization means if we do
not assign any value to the variable then by default, 0 value will be assigned to the variable.
160 | P a g e
Differences b/w static local and static global variable
Static global variable
If the variable declared with a static keyword outside the function, then it is known as a static global
variable. It is accessible throughout the program.
ADVERTISEMENT
The variable with a static keyword is declared inside a function is known as a static local variable. The
scope of the static local variable will be the same as the automatic local variables, but its memory will
be available throughout the program execution. When the function modifies the value of the static
local variable during one function call, then it will remain the same even during the next function call.
161 | P a g e
Programming Errors in C
Errors are the problems or the faults that occur in the program, which makes the behavior of the
program abnormal, and experienced developers can also make these faults. Programming errors are
also known as the bugs or faults, and the process of removing these bugs is known as debugging.
These errors are detected either during the time of compilation or execution. Thus, the errors must be
removed from the program for the successful execution of the program.
o Syntax error
o Run-time error
o Linker error
o Logical error
o Semantic error
Syntax error
Syntax errors are also known as the compilation errors as they occurred at the compilation time, or we
can say that the syntax errors are thrown by the compilers. These errors are mainly occurred due to
the mistakes while typing or do not follow the syntax of the specified programming language. These
mistakes are generally made by beginners only because they are new to the language. These errors
can be easily debugged or corrected.
162 | P a g e
For example:
1. #include <stdio.h>
2. int main()
3. {
4. a = 10;
5. printf("The value of a is : %d", a);
6. return 0;
7. }
Output
In the above output, we observe that the code throws the error that 'a' is undeclared. This error is
nothing but the syntax error only.
There can be another possibility in which the syntax error can exist, i.e., if we make mistakes in the
basic construct. Let's understand this scenario through an example.
1. #include <stdio.h>
163 | P a g e
2. int main()
3. {
4. int a=2;
5. if(.) // syntax error
6.
7. printf("a is greater than 1");
8. return 0;
9. }
In the above code, we put the (.) instead of condition in 'if', so this generates the syntax error as
shown in the below screenshot.
Output
Run-time error
Sometimes the errors exist during the execution-time even after the successful compilation known as
run-time errors. When the program is running, and it is not able to perform the operation is the main
cause of the run-time error. The division by zero is the common example of the run-time error. These
errors are very difficult to find, as the compiler does not point to these errors.
1. #include <stdio.h>
2. int main()
3. {
4. int a=2;
5. int b=2/0;
6. printf("The value of b is : %d", b);
7. return 0;
8. }
164 | P a g e
Output
In the above output, we observe that the code shows the run-time error, i.e., division by zero.
Linker error
Linker errors are mainly generated when the executable file of the program is not created. This can be
happened either due to the wrong function prototyping or usage of the wrong header file. For
example, the main.c file contains the sub() function whose declaration and definition is done in some
other file such as func.c. During the compilation, the compiler finds the sub() function in func.c file,
so it generates two object files, i.e., main.o and func.o. At the execution time, if the definition
of sub() function is not found in the func.o file, then the linker error will be thrown. The most
common linker error that occurs is that we use Main() instead of main().
1. #include <stdio.h>
2. int Main()
3. {
4. int a=78;
5. printf("The value of a is : %d", a);
6. return 0;
7. }
Output
Logical error
The logical error is an error that leads to an undesired output. These errors produce the incorrect
output, but they are error-free, known as logical errors. These types of mistakes are mainly done by
165 | P a g e
beginners. The occurrence of these errors mainly depends upon the logical thinking of the developer.
If the programmers sound logically good, then there will be fewer chances of these errors.
1. #include <stdio.h>
2. int main()
3. {
4. int sum=0; // variable initialization
5. int k=1;
6. for(int i=1;i<=10;i++); // logical error, as we put the semicolon after loop
7. {
8. sum=sum+k;
9. k++;
10. }
11. printf("The value of sum is %d", sum);
12. return 0;
13. }
Output
In the above code, we are trying to print the sum of 10 digits, but we got the wrong output as we put
the semicolon (;) after the for loop, so the inner statements of the for loop will not execute. This
produces the wrong output.
Semantic error
Semantic errors are the errors that occurred when the statements are not understandable by the
compiler.
166 | P a g e
The following can be the cases for the semantic error:
1. #include <stdio.h>
2. int main()
3. {
4.
5. int a,b,c;
6. a=2;
7. b=3;
8. c=1;
9. a+b=c; // semantic error
10. return 0;
11. }
In the above code, we use the statement a+b =c, which is incorrect as we cannot use the two
operands on the left-side.
Output
167 | P a g e
168 | P a g e
Compile time vs Runtime
Compile-time and Runtime are the two programming terms used in the software development. Compile-
time is the time at which the source code is converted into an executable code while the run time is the
time at which the executable code is started running. Both the compile-time and runtime refer to
different types of error.
Compile-time errors
Compile-time errors are the errors that occurred when we write the wrong syntax. If we write the wrong
syntax or semantics of any programming language, then the compile-time errors will be thrown by the
compiler. The compiler will not allow to run the program until all the errors are removed from the
program. When all the errors are removed from the program, then the compiler will generate the
executable file.
ADVERTISEMENT
ADVERTISEMENT
o Syntax errors
o Semantic errors
Syntax errors
When the programmer does not follow the syntax of any programming language, then the compiler will
throw the syntax error.
ADVERTISEMENT
For example,
int a, b:
The above declaration generates the compile-time error as in C, every statement ends with the
semicolon, but we put a colon (:) at the end of the statement.
Semantic errors
The semantic errors exist when the statements are not meaningful to the compiler.
For example,
169 | P a g e
a+b=c
The above statement throws a compile-time errors. In the above statement, we are assigning the value
of 'c' to the summation of 'a' and 'b' which is not possible in C programming language as it can contain
only one variable on the left of the assignment operator while right of the assignment operator can
contain more than one variable.
c=a+b;
Runtime errors
The runtime errors are the errors that occur during the execution and after compilation. The examples of
runtime errors are division by zero, etc. These errors are not easy to detect as the compiler does not
point to these errors.
Let's explore some typical C runtime error types, cases, and their possible effects.
Division by Zero:
Since division by zero is mathematically undefinable, attempting to divide an integer by zero leads to
a runtime error. This mistake causes the program to crash or produce an exception. Here's an example:
#include <stdio.h>
int main() {
int a = 10;
int b = 0;
int result = a / b; // Division by zero
printf("Result: %d\n", result);
return 0;
}
Output:
Explanation:
A "Floating point exception" error message is produced when the program encounters a runtime issue
170 | P a g e
because of division by zero.
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int index = 10;
int value = arr[index]; // Accessing array out of bounds
printf("Value: %d\n", value);
return 0;
}
Output:
Explanation:
The element at index 10 is beyond the bounds of the array when the program tries to access it. As a
result, a segmentation fault occurs, and the program ends with an error.
#include <stdio.h>
int main() {
int* ptr = NULL; // Null pointer
int value = *ptr; // Null pointer dereference
printf("Value: %d\n", value);
return 0;
}
171 | P a g e
Output:
Explanation:
The attempt to dereference a null pointer results in a segmentation fault, which causes the program to
crash with an error message.
Stack Overflow:
A stack overflow happens when the call stack grows larger than intended, containing information about
function calls. An infinite recursion usually results when recursive functions lack appropriate termination
criteria. Here's an example:
#include <stdio.h>
void recursiveFunction() {
recursiveFunction(); // Recursive call without termination condition
}
int main() {
recursiveFunction();
return 0;
10. }
Output:
Explanation:
The program starts an endless recursion, which overflows the stack and causes a segmentation fault.
Unused variables:
Because uninitialized variables have undefined values, using them might result in runtime errors. The
program could provide surprising results or crash, depending on the circumstance. Here's an example:
#include <stdio.h>
172 | P a g e
int main() {
int uninitializedVariable;
printf("Value: %d\n", uninitializedVariable); // Using uninitialized variable
return 0;
}
Output:
Explanation:
In this example, the value of an uninitialized variable can be any random value chosen randomly from
the memory region designated to that variable.
Compile-time Runtime
The compile-time errors are the errors which are The runtime errors are the errors which are not generated
produced at the compile-time, and they are by the compiler and produce an unpredictable result at
detected by the compiler. the execution time.
In this case, the compiler prevents the code from In this case, the compiler does not detect the error, so it
execution if it detects an error in the program. cannot prevent the code from the execution.
It contains the syntax and semantic errors such as It contains the errors such as division by zero, determining
missing semicolon at the end of the statement. the square root of a negative number.
#include <stdio.h>
int main()
{
int a=20;
printf("The value of a is : %d",a):
return 0;
}
In the above code, we have tried to print the value of 'a', but it throws an error. We put the colon at the
173 | P a g e
end of the statement instead of a semicolon, so this code generates a compile-time error.
Output
#include <stdio.h>
int main()
{
int a=20;
int b=a/0; // division by zero
printf("The value of b is : %d",b):
return 0;
}
In the above code, we try to divide the value of 'b' by zero, and this throws a runtime error.
Output
174 | P a g e
Conclusion:
In conclusion, the periods of software development known as compile-time and runtime errors are
separate, and each has a unique set of faults that might occur. Compile-time errors happen when the
code is converted into executable form during the compilation step. These errors include semantic
errors, which produce illogical or absurd code, and syntax faults, which go against the laws of the
programming language. These errors are identified by the compiler and reported, blocking the
execution of the code until they are fixed.
On the other hand, runtime errors occur when a program is running and are not caught by the
compiler. They can result from several conditions, including division by zero, erroneous memory
access, or other unforeseen events. Runtime errors are more difficult to discover and debug since they
frequently result in program crashes or unexpected behavior. To elegantly manage runtime errors and
guarantee the program's stability, developers use error-handling techniques like exception handling.
Conditional Operator in C
The conditional operator is also known as a ternary operator. The conditional statements are the
decision-making statements which depends upon the output of the expression. It is represented by
two symbols, i.e., '?' and ':'.
As conditional operator works on three operands, so it is also known as the ternary operator.
The behavior of the conditional operator is similar to the 'if-else' statement as 'if-else' statement is
also a decision-making statement.
175 | P a g e
Syntax of a conditional operator
1. Expression1? expression2: expression3;
o In the above syntax, the expression1 is a Boolean condition that can be either true or false value.
o If the expression1 results into a true value, then the expression2 will execute.
o The expression2 is said to be true only when it returns a non-zero value.
o If the expression1 returns false value then the expression3 will execute.
o The expression3 is said to be false only when it returns zero value.
1. #include <stdio.h>
2. int main()
3. {
4. int age; // variable declaration
5. printf("Enter your age");
6. scanf("%d",&age); // taking user input for age variable
7. (age>=18)? (printf("eligible for voting")) : (printf("not eligible for voting")); // conditional operator
8. return 0;
9. }
In the above code, we are taking input as the 'age' of the user. After taking input, we have applied the
condition by using a conditional operator. In this condition, we are checking the age of the user. If the
176 | P a g e
age of the user is greater than or equal to 18, then the statement1 will execute, i.e., (printf("eligible for
voting")) otherwise, statement2 will execute, i.e., (printf("not eligible for voting")).
If we provide the age of user below 18, then the output would be:
If we provide the age of user above 18, then the output would be:
As we can observe from the above two outputs that if the condition is true, then the statement1 is
executed; otherwise, statement2 will be executed.
Till now, we have observed that how conditional operator checks the condition and based on
condition, it executes the statements. Now, we will see how a conditional operator is used to assign
the value to a variable.
177 | P a g e
Let's understand this scenario through an example.
1. #include <stdio.h>
2. int main()
3. {
4. int a=5,b; // variable declaration
5. b=((a==5)?(3):(2)); // conditional operator
6. printf("The value of 'b' variable is : %d",b);
7. return 0;
8. }
In the above code, we have declared two variables, i.e., 'a' and 'b', and assign 5 value to the 'a'
variable. After the declaration, we are assigning value to the 'b' variable by using the conditional
operator. If the value of 'a' is equal to 5 then 'b' is assigned with a 3 value otherwise 2.
Output
The above output shows that the value of 'b' variable is 3 because the value of 'a' variable is equal to
5.
As we know that the behavior of conditional operator and 'if-else' is similar but they have some
differences. Let's look at their differences.
178 | P a g e
179 | P a g e
Bitwise Operator in C
The bitwise operators are the operators used to perform the operations on the data at the bit-level.
When we perform the bitwise operations, then it is also known as bit-level programming. It consists of
two digits, either 0 or 1. It is mainly used in numerical computations to make the calculations faster.
We have different types of bitwise operators in the C programming language. The following is the list of the
bitwise operators:
| Bitwise OR operator
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 1
180 | P a g e
Bitwise AND operator
Bitwise AND operator is denoted by the single ampersand sign (&). Two integer operands are written
on both sides of the (&) operator. If the corresponding bits of both the operands are 1, then the
output of the bitwise AND operation is 1; otherwise, the output would be 0.
ADVERTISEMENT
For example,
As we can observe from the above result that bits of both the variables are compared one by one. If
the bit of both the variables is 1 then the output would be 1, otherwise 0.
1. #include <stdio.h>
2. int main()
3. {
4. int a=6, b=14; // variable declarations
5. printf("The output of the Bitwise AND operator a&b is %d",a&b);
6. return 0;
7. }
In the above code, we have created two variables, i.e., 'a' and 'b'. The values of 'a' and 'b' are 6 and 14
respectively. The binary value of 'a' and 'b' are 0110 and 1110, respectively. When we apply the AND
operator between these two variables,
Output
ADVERTISEMENT
181 | P a g e
Bitwise OR operator
The bitwise OR operator is represented by a single vertical sign (|). Two integer operands are written
on both sides of the (|) symbol. If the bit value of any of the operand is 1, then the output would be 1,
otherwise 0.
For example,
As we can observe from the above result that the bits of both the operands are compared one by one;
if the value of either bit is 1, then the output would be 1 otherwise 0.
1. #include <stdio.h>
2. int main()
3. {
4. int a=23,b=10; // variable declarations
5. printf("The output of the Bitwise OR operator a|b is %d",a|b);
6. return 0;
7. }
Output
182 | P a g e
Bitwise exclusive OR operator
Bitwise exclusive OR operator is denoted by (^) symbol. Two operands are written on both sides of
the exclusive OR operator. If the corresponding bit of any of the operand is 1 then the output would
be 1, otherwise 0.
For example,
As we can observe from the above result that the bits of both the operands are compared one by one;
if the corresponding bit value of any of the operand is 1, then the output would be 1 otherwise 0.
1. #include <stdio.h>
2. int main()
3. {
4. int a=12,b=10; // variable declarations
5. printf("The output of the Bitwise exclusive OR operator a^b is %d",a^b);
6. return 0;
7. }
Output
183 | P a g e
Bitwise complement operator
The bitwise complement operator is also known as one's complement operator. It is represented by
the symbol tilde (~). It takes only one operand or variable and performs complement operation on an
operand. When we apply the complement operation on any bits, then 0 becomes 1 and 1 becomes 0.
For example,
ADVERTISEMENT
As we can observe from the above result that if the bit is 1, then it gets changed to 0 else 1.
1. #include <stdio.h>
2. int main()
3. {
4. int a=8; // variable declarations
5. printf("The output of the Bitwise complement operator ~a is %d",~a);
6. return 0;
7. }
Output
184 | P a g e
Bitwise shift operators
Two types of bitwise shift operators exist in C programming. The bitwise shift operators will shift the
bits either on the left-side or right-side. Therefore, we can say that the bitwise shift operator is divided
into two categories:
o Left-shift operator
o Right-shift operator
Left-shift operator
1. Operand << n
Where,
In the case of Left-shift operator, 'n' bits will be shifted on the left-side. The 'n' bits on the left side will
be popped out, and 'n' bits on the right-side are filled with 0.
For example,
1. #include <stdio.h>
2. int main()
3. {
4. int a=5; // variable initialization
5. printf("The value of a<<2 is : %d ", a<<2);
6. return 0;
7. }
Output
Right-shift operator
1. Operand >> n;
Where,
In the case of the right-shift operator, 'n' bits will be shifted on the right-side. The 'n' bits on the right-
side will be popped out, and 'n' bits on the left-side are filled with 0.
For example,
186 | P a g e
1. Suppose we have a statement,
2. int a = 7;
3. The binary representation of the above variable would be:
4. a = 0111
5. If we want to right-shift the above representation by 2, then the statement would be:
6. a>>2;
7. 0000 0111 >> 2 = 0000 0001
1. #include <stdio.h>
2. int main()
3. {
4. int a=7; // variable initialization
5. printf("The value of a>>2 is : %d ", a>>2);
6. return 0;
7. }
Output
187 | P a g e
What is the 2s complement in C?
The 2s complement in C is generated from the 1s complement in C. As we know that the 1s
complement of a binary number is created by transforming bit 1 to 0 and 0 to 1; the 2s complement
of a binary number is generated by adding one to the 1s complement of a binary number.
In short, we can say that the 2s complement in C is defined as the sum of the one's complement in C
and one.
In the above figure, the binary number is equal to 00010100, and its one's complement is calculated
by transforming the bit 1 to 0 and 0 to 1 vice versa. Therefore, one's complement becomes 11101011.
After calculating one's complement, we calculate the two's complement by adding 1 to the one's
complement, and its result is 11101100.
1. #include <stdio.h>
2. int main()
3. {
4. int n; // variable declaration
5. printf("Enter the number of bits do you want to enter :");
6. scanf("%d",&n);
7. char binary[n+1]; // binary array declaration;
8. char onescomplement[n+1]; // onescomplement array declaration
9. char twoscomplement[n+1]; // twoscomplement array declaration
10. int carry=1; // variable initialization
11. printf("\nEnter the binary number : ");
12. scanf("%s", binary);
188 | P a g e
13. printf("%s", binary);
14. printf("\nThe ones complement of the binary number is :");
15.
16. // Finding onescomplement in C
17. for(int i=0;i<n;i++)
18. {
19. if(binary[i]=='0')
20. onescomplement[i]='1';
21. else if(binary[i]=='1')
22. onescomplement[i]='0';
23. }
24. onescomplement[n]='\0';
25. printf("%s",onescomplement);
26.
27.
28. printf("\nThe twos complement of a binary number is : ");
29.
30. // Finding twoscomplement in C
31. for(int i=n-1; i>=0; i--)
32. {
33. if(onescomplement[i] == '1' && carry == 1)
34. {
35. twoscomplement[i] = '0';
36. }
37. else if(onescomplement[i] == '0' && carry == 1)
38. {
39. twoscomplement[i] = '1';
40. carry = 0;
41. }
42. else
43. {
44. twoscomplement[i] = onescomplement[i];
45. }
46. }
47. twoscomplement[n]='\0';
48. printf("%s",twoscomplement);
189 | P a g e
49. return 0;
50. }
Output
Signed integers are frequently represented in C using the two's complement notation. Using the
same binary representation offers a mechanism to express both positive and negative integers.
The most significant bit (MSB) is used as the sign bit in a two's complement representation,
where 0 denotes a positive integer, and 1 denotes a negative number.
Starting with a negative number's absolute value in binary form, you may take the one's
complement (bitwise negation) of that value to get the two's complement representation of
the negative integer. You add 1 to the resultant value to acquire the representation of the two's
complement.
The two's complement encoding in C can represent signed integers and can perform fast arithmetic
operations. One benefit of employing two's complement is the ability to
do addition and subtraction using the same binary operations as for unsigned numbers.
The binary numbers are added together like unsigned integers when adding two's complement. A
carry-out from the location of the main critical bit is just disregarded. Due to this fact,
handling signed numbers differently is not necessary, and addition becomes simple.
Consider adding -5 and -3 using the 8-bit two's complement representation, for instance:
ADVERTISEMENT
1. 11111011 (-5)
2. 11111101 (-3)
3. -------------
4. 111110100 (-8)
Similar to addition, subtraction may be done by treating the second operand's two's complement as
if it were addition. In other words, you add the two's complement of a negative number to the first
operand to remove it.
191 | P a g e
For instance, when -3 is subtracted from -5:
1. 11111011 (-5)
2. 00000011 (+3)
3. -------------
4. 11111110 (-8)
Conclusion:
In C, the 2s complement is a binary representation of a negative number that is created by adding
one to the 1s complement. Computer systems frequently employ this idea to represent signed
numbers and efficiently carry out arithmetic operations.
To get the 2s complement of a binary integer, one must first determine the 1s complement of the
number by flipping the bits. After that, the representation of the 2s complement is obtained
by adding one to the 1s complement. The most significant bit (MSB) will function as a sign bit by
expressing whether a number is positive or negative.
The computation of the 2s complement for a given binary integer is shown in the attached C
program. The user is prompted to input both the binary number and the number of bits. After that,
the program does the required procedures to acquire the 1s complement, and then the 2s
complement. The findings are then shown.
In computer science and programming, it's crucial to comprehend the 2s complement representation
since it makes it possible to handle negative values expressed in binary effectively. It makes addition,
subtraction, and logical operations simpler on both positive and negative numbers. The range
of representable integers is symmetric about zero due to the 2s complement representation,
making it appropriate for various numerical operations.
Programmers may conduct arithmetic operations, work with binary data, and design algorithms using
signed integers in C and other programming languages by understanding the idea of 2s complement
and properly utilizing it.
192 | P a g e
C Fundamental Test 1
Hide Answer
Explanation:
C programming language is invented for developing an operating system called UNIX. By 1973, the
complete UNIX OS is developed using C.
Hide Answer
Explanation:
Compiler used for UNIX is 'cc' their full form is C compiler. gcc is compiler for linux. Borland and vc++
is compiler for windows.
193 | P a g e
3) Which of the following is a logical AND operator?
a. ||
b. !
c. &&
d. None of the above
Hide Answer
Explanation:
The && is called logical AND operator. If both operands are non-zero, then the condition becomes
true.
The || is called logical OR operator. If any of the two operands are non-zero, then the condition
becomes true.
The ! is called logical NOT operator. It is used for reversing the logic state of its operand.
Hide Answer
Explanation:
The %lf format specifier is used for printing the double value in a C program.
ADVERTISEMENT
194 | P a g e
c. erase(var-name);
d. free(var-name);
Hide Answer
Explanation:
The memory allocated by malloc(), calloc(), or realloc() function is deallocated by using the library
function free(var-name).
195 | P a g e
C if else Statement
The if-else statement in C is used to perform the operations based on some specific condition. The
operations specified in if block are executed if and only if the given condition is true.
o If statement
o If-else statement
o If else-if ladder
o Nested if
If Statement
The if statement is used to check some given condition and perform some operations depending
upon the correctness of that condition. It is mostly used in the scenario where we need to perform the
different operations for the different conditions. The syntax of the if statement is given below.
1. if(expression){
2. //code to be executed
3. }
Flowchart of if statement in C
196 | P a g e
Let's see a simple example of C language if statement.
1. #include<stdio.h>
2. int main(){
3. int number=0;
4. printf("Enter a number:");
5. scanf("%d",&number);
6. if(number%2==0){
7. printf("%d is even number",number);
8. }
9. return 0;
10. }
Output
Enter a number:4
197 | P a g e
4 is even number
enter a number:5
Output
If-else Statement
The if-else statement is used to perform two operations for a single condition. The if-else statement is
an extension to the if statement using which, we can perform two different operations, i.e., one is for
the correctness of that condition, and the other is for the incorrectness of the condition. Here, we
must notice that if and else block cannot be executed simiulteneously. Using if-else statement is
198 | P a g e
always preferable since it always invokes an otherwise case with every if condition. The syntax of the
if-else statement is given below.
1. if(expression){
2. //code to be executed if condition is true
3. }else{
4. //code to be executed if condition is false
5. }
Let's see the simple example to check whether a number is even or odd using if-else statement in C
language.
1. #include<stdio.h>
2. int main(){
199 | P a g e
3. int number=0;
4. printf("enter a number:");
5. scanf("%d",&number);
6. if(number%2==0){
7. printf("%d is even number",number);
8. }
9. else{
10. printf("%d is odd number",number);
11. }
12. return 0;
13. }
Output
enter a number:4
4 is even number
enter a number:5
5 is odd number
Output
1. if(condition1){
2. //code to be executed if condition1 is true
3. }else if(condition2){
4. //code to be executed if condition2 is true
5. }
6. else if(condition3){
7. //code to be executed if condition3 is true
8. }
9. ...
10. else{
11. //code to be executed if all the conditions are false
12. }
201 | P a g e
The example of an if-else-if statement in C language is given below.
1. #include<stdio.h>
2. int main(){
3. int number=0;
4. printf("enter a number:");
5. scanf("%d",&number);
6. if(number==10){
7. printf("number is equals to 10");
8. }
9. else if(number==50){
10. printf("number is equal to 50");
11. }
12. else if(number==100){
13. printf("number is equal to 100");
202 | P a g e
14. }
15. else{
16. printf("number is not equal to 10, 50 or 100");
17. }
18. return 0;
19. }
Output
enter a number:4
number is not equal to 10, 50 or 100
enter a number:50
number is equal to 50
Output
C Switch Statement
The switch statement in C is an alternate to if-else-if ladder statement which allows us to execute
multiple operations for the different possibles values of a single variable called switch variable. Here,
We can define various statements in the multiple cases for the different values of a single variable.
1. switch(expression){
2. case value1:
3. //code to be executed;
4. break; //optional
5. case value2:
6. //code to be executed;
7. break; //optional
8. ......
9.
10. default:
11. code to be executed if all cases are not matched;
12. }
204 | P a g e
4. The break statement in switch case is not must. It is optional. If there is no break statement found in the
case, all the cases will be executed present after the matched case. It is known as fall through the state
of C switch statement.
Let's try to understand it by the examples. We are assuming that there are following variables.
1. int x,y,z;
2. char a,b;
3. float f;
205 | P a g e
Flowchart of switch statement in C
206 | P a g e
How does C switch statement work?
Let's go through the step-by-step process of how the switch statement works in C:
C Program:
1. #include <stdio.h>
2.
3. int main() {
4. int num = 2;
5. switch (num) {
6. case 1:
7. printf("Value is 1\n");
8. break;
9. case 2:
10. printf("Value is 2\n");
11. break;
12. case 3:
13. printf("Value is 3\n");
14. break;
15. default:
16. printf("Value is not 1, 2, or 3\n");
17. break;
18. }
19.
20. return 0;
21. }
Output
Value is 2
Step-by-step Process:
1. The switch variable num is evaluated. In this case, num is initialized with the value 2.
2. The evaluated num (2) value is compared with the constants specified in each case label inside
the switch block.
207 | P a g e
3. The switch statement matches the evaluated value (2) with the constant specified in the second case
(case 2). Since there is a match, the program jumps to the code block associated with the matching
case (case 2).
4. The code block associated with case 2 is executed, which prints "Value is 2" to the console.
5. The "break" keyword is present in the code block of case 2. As a result, the program breaks out of the
switch statement immediately after executing the code block.
6. The program control continues after the switch statement, and any statements following the switch
statement are executed. In this case, there are no statements after the switch, so the program
terminates.
7. The switch statement evaluated the value of the variable num, found a match with case 2, executed
the corresponding code block, and then exited the switch block due to the presence of the "break"
statement.
ADVERTISEMENT
1. #include<stdio.h>
2. int main(){
3. int number=0;
4. printf("enter a number:");
5. scanf("%d",&number);
6. switch(number){
7. case 10:
8. printf("number is equals to 10");
9. break;
10. case 50:
11. printf("number is equal to 50");
12. break;
13. case 100:
14. printf("number is equal to 100");
15. break;
16. default:
17. printf("number is not equal to 10, 50 or 100");
18. }
19. return 0;
208 | P a g e
20. }
Output
enter a number:4
number is not equal to 10, 50 or 100
enter a number:50
number is equal to 50
Output
hi
1. Break Keyword:
The "break" keyword is used within the code block of each case to terminate the switch statement
prematurely. When the program encounters a "break" statement inside a case block, it immediately
209 | P a g e
exits the switch statement, preventing the execution of subsequent case blocks. The "break"
statement is crucial for avoiding switch statements' "fall-through" behavior.
Example:
1. #include <stdio.h>
2. int main() {
3. int num = 3;
4.
5. switch (num) {
6. case 1:
7. printf("Value is 1\n");
8. break; // Exit the switch statement after executing this case block
9. case 2:
10. printf("Value is 2\n");
11. break; // Exit the switch statement after executing this case block
12. case 3:
13. printf("Value is 3\n");
14. break; // Exit the switch statement after executing this case block
15. default:
16. printf("Value is not 1, 2, or 3\n");
17. break; // Exit the switch statement after executing the default case block
18. }
19.
20. return 0;
21. }
Output
Value is 3
Explanation:
In this example, the switch statement evaluates the value of the variable num (which is 3) and
matches it with case 3. The code block associated with case 3 is executed, printing "Value is 3" to
the console. The "break" statement within case 3 ensures that the program exits the switch
statement immediately after executing this case block, preventing the execution of any other cases.
210 | P a g e
2. Default Keyword:
When none of the case constants match the evaluated expression, it operates as a catch-all case. If
no matching case exists and a "default" case exists, the code block associated with
the "default" case is run. It is often used to handle circumstances where none of the stated situations
apply to the provided input.
ADVERTISEMENT
Example:
1. #include <stdio.h>
2. int main() {
3. int num = 5;
4.
5. switch (num) {
6. case 1:
7. printf("Value is 1\n");
8. break;
9. case 2:
10. printf("Value is 2\n");
11. break;
12. case 3:
13. printf("Value is 3\n");
14. break;
15. default:
16. printf("Value is not 1, 2, or 3\n");
17. break; // Exit the switch statement after executing the default case block
18. }
19.
20. return 0;
21. }
ADVERTISEMENT
ADVERTISEMENT
Output
Value is not 1, 2, or 3
211 | P a g e
Explanation:
In this example, the switch statement examines the value of the variable num (which is 5). Because
no case matches the num, the program performs the code block associated with the "default" case.
The "break" statement inside the "default" case ensures that the program exits the switch
statement after executing the "default" case block.
Both the "break" and "default" keywords play essential roles in controlling the flow of execution
within a switch statement. The "break" statement helps prevent the fall-through behavior, while
the "default" case provides a way to handle unmatched cases.
Let's try to understand the fall through state of switch statement by the example given below.
1. #include<stdio.h>
2. int main(){
3. int number=0;
4.
5. printf("enter a number:");
6. scanf("%d",&number);
7.
8. switch(number){
9. case 10:
10. printf("number is equal to 10\n");
11. case 50:
12. printf("number is equal to 50\n");
13. case 100:
14. printf("number is equal to 100\n");
15. default:
16. printf("number is not equal to 10, 50 or 100");
17. }
18. return 0;
19. }
Output
212 | P a g e
enter a number:10
number is equal to 10
number is equal to 50
number is equal to 100
number is not equal to 10, 50 or 100
Output
enter a number:50
number is equal to 50
number is equal to 100
number is not equal to 10, 50 or 100
1. #include <stdio.h>
2. int main () {
3.
4. int i = 10;
5. int j = 20;
6.
7. switch(i) {
8.
9. case 10:
10. printf("the value of i evaluated in outer switch: %d\n",i);
11. case 20:
12. switch(j) {
13. case 20:
14. printf("The value of j evaluated in nested switch: %d\n",j);
15. }
16. }
17.
18. printf("Exact value of i is : %d\n", i );
19. printf("Exact value of j is : %d\n", j );
20.
21. return 0;
22. }
Output
213 | P a g e
the value of i evaluated in outer switch: 10
The value of j evaluated in nested switch: 20
Exact value of i is : 10
Exact value of j is : 20
o Readability and clarity: The switch statement provides a concise and straightforward way to
express multiway branching in the code. Dealing with multiple cases can make the code more
organized and easier to read than multiple nested if-else statements.
o Efficiency: The switch statement is generally more efficient than a series of if-else statements when
dealing with multiple conditions. It works as a direct jump table, which makes it faster and more
optimized in terms of execution time.
o Case-based logic: The switch statement naturally fits scenarios where the program needs to make
decisions based on specific values of a single variable. It is an intuitive and straightforward way to
implement case-based logic.
The switch statement supports using a default case which serves as a catch-all option for values
that do not match any provided cases. This default case handles unusual inputs or circumstances that
are not expressly stated.
o Limited expressions: The expression used in the switch statement must result in an integral value
(char, int, enum) or a compatible data type. It cannot handle more complex or non-constant
expressions, limiting its flexibility in some scenarios.
o Inability to compare ranges: Unlike if-else statements, the switch statement cannot handle ranges
of values directly. Each case in the switch statement represents a specific constant value, making it
challenging to handle a range of values efficiently.
o No support for floating-point numbers: The switch statement only accepts integral types
(integers) and values from enums; it does not accept floating-point numbers. It does not handle non-
integral data types like floating-point integers, which might be problematic in some circumstances.
214 | P a g e
o Fall-through behavior: Switch statements have "fall-through" behavior by default which implies that
if a case does not include a "break" statement, execution will "fall through" to the following case
block. If not managed appropriately, this might result in unwanted behavior.
o Duplicate code: Using a switch statement might result in duplicate code in some circumstances,
especially when numerous cases demand the same actions. If not properly managed, this might result in
code duplication.
o Nested switches can become complex: When dealing with nested switch statements, the code can
become complex and less readable. It may require additional effort to understand and maintain such
nested structures.
if-else vs switch
What is an if-else statement?
An if-else statement in C programming is a conditional statement that executes a different set of
statements based on the condition that is true or false. The 'if' block will be executed only when the
specified condition is true, and if the specified condition is false, then the else block will be executed.
1. if(expression)
2. {
3. // statements;
4. }
5. else
6. {
7. // statements;
8. }
What is a switch statement?
A switch statement is a conditional statement used in C programming to check the value of a variable
and compare it with all the cases. If the value is matched with any case, then its corresponding
statements will be executed. Each case has some name or number known as the identifier. The value
entered by the user will be compared with all the cases until the case is found. If the value entered by
the user is not matched with any case, then the default statement will be executed.
1. switch(expression)
215 | P a g e
2. {
3. case constant 1:
4. // statements;
5. break;
6. case constant 2:
7. // statements;
8. break;
9. case constant n:
10. // statements;
11. break;
12. default:
13. // statements;
14. }
Similarity b/w if-else and switch
Both the if-else and switch are the decision-making statements. Here, decision-making statements
mean that the output of the expression will decide which statements are to be executed.
o Definition
if-else
Based on the result of the expression in the 'if-else' statement, the block of statements will be
executed. If the condition is true, then the 'if' block will be executed otherwise 'else' block will execute.
216 | P a g e
Switch statement
The switch statement contains multiple cases or choices. The user will decide the case, which is to
execute.
o Expression
If-else
It can contain a single expression or multiple expressions for multiple choices. In this, an expression is
evaluated based on the range of values or conditions. It checks both equality and logical expressions.
Switch
It contains only a single expression, and this expression is either a single integer object or a string
object. It checks only equality expression.
o Evaluation
If-else
An if-else statement can evaluate almost all the types of data such as integer, floating-point,
character, pointer, or Boolean.
Switch
o Sequence of Execution
If-else
In the case of 'if-else' statement, either the 'if' block or the 'else' block will be executed based on the
condition.
Switch
In the case of the 'switch' statement, one case after another will be executed until the break keyword
is not found, or the default statement is executed.
o Default Execution
If-else
217 | P a g e
If the condition is not true within the 'if' statement, then by default, the else block statements will be
executed.
Switch
If the expression specified within the switch statement is not matched with any of the cases, then the
default statement, if defined, will be executed.
o Values
If-else
Values are based on the condition specified inside the 'if' statement. The value will decide either the
'if' or 'else' block is to be executed.
Switch
In this case, value is decided by the user. Based on the choice of the user, the case will be executed.
o Use
If-else
Switch
A switch statement compares the value of the variable with multiple cases. If the value is matched
with any of the cases, then the block of statements associated with this case will be executed.
o Editing
If-else
Editing in 'if-else' statement is not easy as if we remove the 'else' statement, then it will create the
havoc.
Switch
Editing in switch statement is easier as compared to the 'if-else' statement. If we remove any of the
cases from the switch, then it will not interrupt the execution of other cases. Therefore, we can say
that the switch statement is easy to modify and maintain.
o Speed
218 | P a g e
If-else
If the choices are multiple, then the speed of the execution of 'if-else' statements is slow.
Switch
The case constants in the switch statement create a jump table at the compile time. This jump table
chooses the path of the execution based on the value of the expression. If we have a multiple choice,
then the execution of the switch statement will be much faster than the equivalent logic of 'if-else'
statement.
If-else switch
Definition Depending on the condition in the 'if' The user will decide which statement is to be
statement, 'if' and 'else' blocks are executed.
executed.
Expression It contains either logical or equality It contains a single expression which can be either a
expression. character or integer variable.
Evaluation It evaluates all types of data, such as It evaluates either an integer, or character.
integer, floating-point, character or
Boolean.
Sequence of First, the condition is checked. If the It executes one case after another till the break
execution condition is true then 'if' block is keyword is not found, or the default statement is
executed otherwise 'else' block executed.
Default If the condition is not true, then by If the value does not match with any case, then by
execution default, else block will be executed. default, default statement is executed.
Editing Editing is not easy in the 'if-else' Cases in a switch statement are easy to maintain and
statement. modify. Therefore, we can say that the removal or
editing of any case will not interrupt the execution of
other cases.
Speed If there are multiple choices If we have multiple choices then the switch statement
implemented through 'if-else', then is the best option as the speed of the execution will
219 | P a g e
the speed of the execution will be be much higher than 'if-else'.
slow.
C Loops
The looping can be defined as repeating the same process multiple times until a specific condition
satisfies. There are three types of loops used in the C language. In this part of the tutorial, we are
going to learn all the aspects of C loops.
Advantage of loops in C
1) It provides code reusability.
2) Using loops, we do not need to write the same code again and again.
3) Using loops, we can traverse over the elements of data structures (array or linked lists).
Types of C Loops
There are three types of loops in C language that is given below:
1. do while
2. while
3. for
do-while loop in C
The do-while loop continues until a given condition satisfies. It is also called post tested loop. It is
used when it is necessary to execute the loop at least once (mostly menu driven programs).
220 | P a g e
1. do{
2. //code to be executed
3. }while(condition);
while loop in C
The while loop in c is to be used in the scenario where we don't know the number of iterations in
advance. The block of statements is executed in the while loop until the condition specified in the
while loop is satisfied. It is also called a pre-tested loop.
1. while(condition){
2. //code to be executed
3. }
for loop in C
The for loop is used in the case where we need to execute some part of the code until the given
condition is satisfied. The for loop is also called as a per-tested loop. It is better to use for loop if the
number of iteration is known in advance.
1. for(initialization;condition;incr/decr){
2. //code to be executed
3. }
do while loop in C
A loop is a programming control structure that allows you to execute a block of code indefinitely if a
specific condition is met. Loops are used to execute repeating activities and boost programming
performance. There are multiple loops in the C programming language, one of which is the "do-
while" loop.
221 | P a g e
A "do-while" loop is a form of a loop in C that executes the code block first, followed by the
condition. If the condition is true, the loop continues to run; else, it stops. However, whether the
condition is originally true, it ensures that the code block is performed at least once.
1. do{
2. //code to be executed
3. }while(condition);
ADVERTISEMENT
ADVERTISEMENT
Example:
1. #include <stdio.h>
2. #include <string.h>
3. int main() {
4. char password[] = "secret";
5. char input[20];
6. do {
7. printf("Enter the password: ");
8. scanf("%s", input);
9. } while (strcmp(input, password) != 0);
10. printf("Access granted!\n");
222 | P a g e
11. return 0;
12. }
1. The following header files are included: <stdio.h> for standard input and output routines
and <string.h> for string manipulation functions.
2. The correct password is defined as a character array (char password[]) with the value "secret"
3. After that, we define another character array input to store the user's input.
4. The do keyword indicates that the code block included within the loop will be performed at least once.
5. Using the printf() function, we display a prompt requesting the user to input their password inside the
Loop.
6. Next, we read the user's input using the scanf() function and store it in the input array.
7. After reading the input, we use the strcmp() function to compare the input with the correct password.
If the strings are equal, the strcmp function returns 0. So, we continue looping as long as the input
and the password are not equal.
8. Once the correct password is entered, the loop terminates, and we print "Access granted!" using
the printf() function.
9. After that, the program returns 0 to indicate successful execution.
Output:
Explanation:
In this example, the user initially enters the wrong passwords, "123" and "abc". The loop prompts the
user until the correct password "secret" is entered. Once the correct password is provided, the loop
terminates, and the "Access granted!" message is displayed.
223 | P a g e
1. #include <stdio.h>
2. int main() {
3. inti = 1;
4. do {
5. printf("%d\n", i);
6. i++;
7. } while (i<= 5);
8. return 0;
9. }
Output:
1
2
3
4
5
Explanation:
In this example, the code block within the do loop will be executed at least once, printing numbers
from 1 to 5. After each iteration, the i value is incremented, and the condition i<= 5 is checked. If the
condition is still true, the loop continues; otherwise, it terminates.
Example 2:
ADVERTISEMENT
Program to print table for the given number using do while Loop
1. #include<stdio.h>
2. intmain(){
3. inti=1,number=0;
4. printf("Enter a number: ");
5. scanf("%d",&number);
6. do{
7. printf("%d \n",(number*i));
8. i++;
9. }while(i<=10);
10. return 0;
11. }
224 | P a g e
Output:
Enter a number: 5
5
10
15
20
25
30
35
40
45
50
Enter a number: 10
10
20
30
40
50
60
70
80
90
100
Example 3:
Let's take a program that prints the multiplication table of a given number N using a do...while Loop:
1. #include <stdio.h>
2. int main() {
3. int N;
4. printf("Enter a number to generate its multiplication table: ");
5. scanf("%d", &N);
6. inti = 1;
7. do {
8. printf("%d x %d = %d\n", N, i, N * i);
9. i++;
10. } while (i<= 10);
11. return 0;
12. }
Output:
ADVERTISEMENT
ADVERTISEMENT
The program calculates and prints the multiplication table for 7 from 1 to 10.
Example:
1. #include <stdio.h>
2. int main() {
3. inti = 1;
4. do {
5. printf("Iteration %d\n", i);
6. i++;
7. } while (1); // Condition is always true
8.
9. return 0;
10. }
In this example, the loop will keep running indefinitely because condition 1 is always true.
Output:
ADVERTISEMENT
When you run the program, you will see that it continues printing "Iteration x", where x is
the iteration number without stopping:
Iteration 1
Iteration 2
Iteration 3
Iteration 4
Iteration 5
... (and so on)
226 | P a g e
To interrupt an infinite loop like this, you generally use a break statement within the loop or some
external condition you can control, such as hitting a specific key combination. In most desktop
settings, the keyboard shortcut Ctrl+C can escape the Loop.
Example:
1. #include <stdio.h>
2. int main() {
3. int rows, i = 1;
4. printf("Enter the number of rows: ");
5. scanf("%d", &rows);
6. do {
7. int j = 1;
8. do {
9. printf("%d ", j);
10. j++;
11. } while (j <= i);
12. printf("\n");
13. i++;
14. } while (i<= rows);
15. return 0;
16. }
In this program, we use nested do...while loops to generate a pattern of numbers. The outer
loop controls the number of rows, and the inner loop generates the numbers for each row.
Output:
Explanation:
227 | P a g e
In this example, the program generates a pattern of numbers in a triangular shape. The outer
loop iterates over the rows, and the inner loop iterates within each row, printing the numbers from 1
up to the current row number.
Loop Body Execution Condition is checked before execution. The body is executed before the condition.
First Execution The condition must be true initially. The body is executed at least once.
Loop Execution May execute zero or more times. Will execute at least once.
Example while (i< 5) { printf("%d\n", i); i++; } do { printf("%d\n", i); i++; } while (i< 5);
Common Use Cases When the loop may not run at all. When you want the loop to run at least once.
While Loop: The loop body is executed before the condition is checked. If the condition is
initially false, the loop may not execute.
Do-while Loop: The loop body is executed at least once before the condition is checked. This
guarantees that the loop completes at least one iteration.
When you want the loop to run based on a condition that may be false at first, use the while loop,
and when you want the loop to run at least once regardless of the starting state, use the do-while
loop.
228 | P a g e
o Guaranteed Execution: Unlike other loop structures, the do-while oop ensures that the loop body is
executed at least once. Because the condition is assessed after the loop body, the code within the loop
is performed before the condition is verified.
o Loop after testing: The do-while loop is a post-tested loop which implies that the loop condition is
assessed after the loop body has been executed. If the condition is true, the loop body is run once
again. This behavior allows you to verify the condition for repetition before ensuring that a given
activity is completed.
o Conditionally Controlled: The loop continues to execute as long as the condition specified after the
while keyword remains true. When the condition evaluates to false, the loop is terminated, and control
shifts to the sentence after the loop.
o Flexibility: The do-while loop may be utilized in several contexts. It is typically used in cases where a
piece of code must be executed at least once, such as menu-driven programs, input
validation, or repetitive computations.
o Nesting Capability: Similar to other loop constructs, the do-while loop can be nested inside
other loops or control structures to create more complex control flow patterns. It allows for the
creation of nested loops and the implementation of intricate repetitive tasks.
o Break and Continue: The break statement can be used within a do-while loop to terminate the loop
execution and exit the loop prematurely. The continue statement can skip the remaining code in the
current iteration and jump to the next iteration of the loop.
o Local Scope: Variables declared inside the do-while loop body have local scope and are accessible
only within the loop block. They cannot be accessed outside the loop or by other loops or control
structures.
o Infinite Loop Control: It is crucial to ensure that the loop's condition is eventually modified within
the loop body. This modification is necessary to prevent infinite loops where the condition continually
evaluates to true. Modifying the condition ensures that the loop terminates at some point.
while loop in C
While loop is also known as a pre-tested loop. In general, a while loop allows a part of the code to be
executed multiple times depending upon a given boolean condition. It can be viewed as a repeating if
statement. The while loop is mostly used in the case where the number of iterations is not known in
advance.
229 | P a g e
1. while(condition){
2. //code to be executed
3. }
Flowchart of while loop in C
1. #include<stdio.h>
2. int main(){
3. int i=1;
4. while(i<=10){
5. printf("%d \n",i);
6. i++;
7. }
8. return 0;
9. }
Output
1
2
3
4
230 | P a g e
5
6
7
8
9
10
Example 1
1. #include<stdio.h>
2. void main ()
3. {
4. int j = 1;
5. while(j+=2,j<=10)
6. {
7. printf("%d ",j);
8. }
9. printf("%d",j);
10. }
Output
3 5 7 9 11
Example 2
1. #include<stdio.h>
2. void main ()
3. {
4. while()
5. {
6. printf("hello Javatpoint");
7. }
8. }
Output
compile time error: while loop can't be empty
Example 3
1. #include<stdio.h>
2. void main ()
3. {
4. int x = 10, y = 2;
5. while(x+y-1)
232 | P a g e
6. {
7. printf("%d %d",x--,y--);
8. }
9. }
Output
infinite loop
1. while(1){
2. //statement
3. }
for loop in C
The for loop in C language is used to iterate the statements or a part of the program several times. It
is frequently used to traverse the data structures like the array and linked list.
233 | P a g e
Flowchart of for loop in C
1. #include<stdio.h>
2. int main(){
3. int i=0;
4. for(i=1;i<=10;i++){
5. printf("%d \n",i);
6. }
7. return 0;
8. }
Output
234 | P a g e
1
2
3
4
5
6
7
8
9
10
C Program: Print table for the given number using C for loop
1. #include<stdio.h>
2. int main(){
3. int i=1,number=0;
4. printf("Enter a number: ");
5. scanf("%d",&number);
6. for(i=1;i<=10;i++){
7. printf("%d \n",(number*i));
8. }
9. return 0;
10. }
Output
Enter a number: 2
2
4
6
8
10
12
14
16
18
20
Enter a number: 1000
1000
2000
3000
4000
5000
6000
7000
8000
9000
10000
Properties of Expression 1
ADVERTISEMENT
ADVERTISEMENT
235 | P a g e
o The expression represents the initialization of the loop variable.
o We can initialize more than one variable in Expression 1.
o Expression 1 is optional.
o In C, we can not declare the variables in Expression 1. However, It can be an exception in some
compilers.
Example 1
1. #include <stdio.h>
2. int main()
3. {
4. int a,b,c;
5. for(a=0,b=12,c=23;a<2;a++)
6. {
7. printf("%d ",a+b+c);
8. }
9. }
Output
35 36
Example 2
1. #include <stdio.h>
2. int main()
3. {
4. int i=1;
5. for(;i<5;i++)
6. {
7. printf("%d ",i);
8. }
9. }
Output
1 2 3 4
236 | P a g e
Properties of Expression 2
o Expression 2 is a conditional expression. It checks for a specific condition to be satisfied. If it is not, the
loop is terminated.
o Expression 2 can have more than one condition. However, the loop will iterate until the last condition
becomes false. Other conditions will be treated as statements.
o Expression 2 is optional.
o Expression 2 can perform the task of expression 1 and expression 3. That is, we can initialize the variable
as well as update the loop variable in expression 2 itself.
o We can pass zero or non-zero value in expression 2. However, in C, any non-zero value is true, and zero
is false by default.
Example 1
ADVERTISEMENT
1. #include <stdio.h>
2. int main()
3. {
4. int i;
5. for(i=0;i<=4;i++)
6. {
7. printf("%d ",i);
8. }
9. }
output
0 1 2 3 4
Example 2
1. #include <stdio.h>
2. int main()
3. {
4. int i,j,k;
5. for(i=0,j=0,k=0;i<4,k<8,j<10;i++)
6. {
7. printf("%d %d %d\n",i,j,k);
8. j+=2;
237 | P a g e
9. k+=3;
10. }
11. }
Output
0 0 0
1 2 3
2 4 6
3 6 9
4 8 12
Example 3
1. #include <stdio.h>
2. int main()
3. {
4. int i;
5. for(i=0;;i++)
6. {
7. printf("%d",i);
8. }
9. }
Output
infinite loop
Properties of Expression 3
o Expression 3 is used to update the loop variable.
o We can update more than one variable at the same time.
o Expression 3 is optional.
Example 1
1. #include<stdio.h>
2. void main ()
3. {
4. int i=0,j=2;
5. for(i = 0;i<5;i++,j=j+2)
6. {
7. printf("%d %d\n",i,j);
238 | P a g e
8. }
9. }
Output
0 2
1 4
2 6
3 8
4 10
Loop body
The braces {} are used to define the scope of the loop. However, if the loop contains only one
statement, then we don't need to use braces. A loop without a body is possible. The braces work as a
block separator, i.e., the value variable declared inside for loop is valid only for that block and not
outside. Consider the following example.
1. #include<stdio.h>
2. void main ()
3. {
4. int i;
5. for(i=0;i<10;i++)
6. {
7. int i = 20;
8. printf("%d ",i);
9. }
10. }
Output
20 20 20 20 20 20 20 20 20 20
1. #include<stdio.h>
2. void main ()
3. {
4. for(;;)
5. {
6. printf("welcome to javatpoint");
239 | P a g e
7. }
8. }
If you run this program, you will see above statement infinite times.
Nested Loops in C
C supports nesting of loops in C. Nesting of loops is the feature in C that allows the looping of
statements inside another loop. Let's observe an example of nesting loops in C.
Any number of loops can be defined inside another loop, i.e., there is no restriction for defining any
number of loops. The nesting level can be defined at n times. You can define any type of loop inside
another loop; for example, you can define 'while' loop inside a 'for' loop.
1. Outer_loop
2. {
3. Inner_loop
4. {
5. // inner loop statements.
6. }
7. // outer loop statements.
8. }
Outer_loop and Inner_loop are the valid loops that can be a 'for' loop, 'while' loop or 'do-while' loop.
ADVERTISEMENT
The nested for loop means any type of loop which is defined inside the 'for' loop.
1. #include <stdio.h>
2. int main()
3. {
4. int n;// variable declaration
5. printf("Enter the value of n :");
6. // Displaying the n tables.
7. for(int i=1;i<=n;i++) // outer loop
8. {
9. for(int j=1;j<=10;j++) // inner loop
10. {
11. printf("%d\t",(i*j)); // printing the value.
12. }
13. printf("\n");
14. }
ADVERTISEMENT
ADVERTISEMENT
o First, the 'i' variable is initialized to 1 and then program control passes to the i<=n.
o The program control checks whether the condition 'i<=n' is true or not.
o If the condition is true, then the program control passes to the inner loop.
o The inner loop will get executed until the condition is true.
o After the execution of the inner loop, the control moves back to the update of the outer loop,
i.e., i++.
o After incrementing the value of the loop counter, the condition is checked again, i.e., i<=n.
o If the condition is true, then the inner loop will be executed again.
o This process will continue until the condition of the outer loop is true.
Output:
241 | P a g e
Nested while loop
The nested while loop means any type of loop which is defined inside the 'while' loop.
1. while(condition)
2. {
3. while(condition)
4. {
5. // inner loop statements.
6. }
7. // outer loop statements.
8. }
1. #include <stdio.h>
2. int main()
3. {
4. int rows; // variable declaration
5. int columns; // variable declaration
6. int k=1; // variable initialization
7. printf("Enter the number of rows :"); // input the number of rows.
8. scanf("%d",&rows);
9. printf("\nEnter the number of columns :"); // input the number of columns.
10. scanf("%d",&columns);
11. int a[rows][columns]; //2d array declaration
12. int i=1;
13. while(i<=rows) // outer loop
14. {
242 | P a g e
15. int j=1;
16. while(j<=columns) // inner loop
17. {
18. printf("%d\t",k); // printing the value of k.
19. k++; // increment counter
20. j++;
21. }
22. i++;
23. printf("\n");
24. }
25. }
Output:
243 | P a g e
Nested do..while loop
The nested do..while loop means any type of loop which is defined inside the 'do..while' loop.
1. do
2. {
3. do
4. {
5. // inner loop statements.
6. }while(condition);
7. // outer loop statements.
8. }while(condition);
1. #include <stdio.h>
2. int main()
3. {
4. /*printing the pattern
5. ********
6. ********
7. ********
8. ******** */
9. int i=1;
10. do // outer loop
11. {
12. int j=1;
13. do // inner loop
14. {
15. printf("*");
16. j++;
17. }while(j<=8);
18. printf("\n");
19. i++;
20. }while(i<=4);
21. }
Output:
244 | P a g e
Explanation of the above code.
Infinite Loop in C
What is infinite loop?
An infinite loop is a looping construct that does not terminate the loop and executes the loop forever.
It is also called an indefinite loop or an endless loop. It either produces a continuous output or no
output.
o All the operating systems run in an infinite loop as it does not exist after performing some task. It
comes out of an infinite loop only when the user manually shuts down the system.
o All the servers run in an infinite loop as the server responds to all the client requests. It comes out of an
indefinite loop only when the administrator shuts down the server manually.
245 | P a g e
o All the games also run in an infinite loop. The game will accept the user requests until the user exits
from the game.
We can create an infinite loop through various loop structures. The following are the loop structures
through which we will define the infinite loop:
o for loop
o while loop
o do-while loop
o go to statement
o C macros
For loop
Let's see the infinite 'for' loop. The following is the definition for the infinite for loop:
1. for(; ;)
2. {
3. // body of the for loop.
4. }
As we know that all the parts of the 'for' loop are optional, and in the above for loop, we have not
mentioned any condition; so, this loop will execute infinite times.
1. #include <stdio.h>
2. int main()
3. {
4. for(;;)
5. {
6. printf("Hello javatpoint");
7. }
8. return 0;
9. }
In the above code, we run the 'for' loop infinite times, so "Hello javatpoint" will be displayed
infinitely.
246 | P a g e
Output
while loop
Now, we will see how to create an infinite loop using a while loop. The following is the definition for
the infinite while loop:
1. while(1)
2. {
3. // body of the loop..
4. }
In the above while loop, we put '1' inside the loop condition. As we know that any non-zero integer
represents the true condition while '0' represents the false condition.
1. #include <stdio.h>
2. int main()
3. {
4. int i=0;
5. while(1)
6. {
7. i++;
8. printf("i is :%d",i);
247 | P a g e
9. }
10. return 0;
11. }
In the above code, we have defined a while loop, which runs infinite times as it does not contain any
condition. The value of 'i' will be updated an infinite number of times.
Output
do..while loop
The do..while loop can also be used to create the infinite loop. The following is the syntax to create
the infinite do..while loop.
1. do
2. {
3. // body of the loop..
4. }while(1);
The above do..while loop represents the infinite condition as we provide the '1' value inside the loop
condition. As we already know that non-zero integer represents the true condition, so this loop will
run infinite times.
goto statement
We can also use the goto statement to define the infinite loop.
248 | P a g e
1. infinite_loop;
2. // body statements.
3. goto infinite_loop;
In the above code, the goto statement transfers the control to the infinite loop.
Macros
ADVERTISEMENT
We can also create the infinite loop with the help of a macro constant. Let's understand through an
example.
1. #include <stdio.h>
2. #define infinite for(;;)
3. int main()
4. {
5.
6. infinite
7. {
8. printf("hello");
9. }
10.
11. return 0;
12. }
In the above code, we have defined a macro named as 'infinite', and its value is 'for(;;)'. Whenever the
word 'infinite' comes in a program then it will be replaced with a 'for(;;)'.
Output
249 | P a g e
Till now, we have seen various ways to define an infinite loop. However, we need some approach to
come out of the infinite loop. In order to come out of the infinite loop, we can use the break
statement.
1. #include <stdio.h>
2. int main()
3. {
4. char ch;
5. while(1)
6. {
7. ch=getchar();
8. if(ch=='n')
9. {
10. break;
11. }
12. printf("hello");
13. }
14. return 0;
15. }
In the above code, we have defined the while loop, which will execute an infinite number of times
until we press the key 'n'. We have added the 'if' statement inside the while loop. The 'if' statement
contains the break keyword, and the break keyword brings control out of the loop.
250 | P a g e
Unintentional infinite loops
Sometimes the situation arises where unintentional infinite loops occur due to the bug in the code. If
we are the beginners, then it becomes very difficult to trace them. Below are some measures to trace
an unintentional infinite loop:
o We should examine the semicolons carefully. Sometimes we put the semicolon at the wrong place,
which leads to the infinite loop.
1. #include <stdio.h>
2. int main()
3. {
4. int i=1;
5. while(i<=10);
6. {
7. printf("%d", i);
8. i++;
9. }
10. return 0;
11. }
In the above code, we put the semicolon after the condition of the while loop which leads to the
infinite loop. Due to this semicolon, the internal body of the while loop will not execute.
o We should check the logical conditions carefully. Sometimes by mistake, we place the assignment
operator (=) instead of a relational operator (= =).
1. #include <stdio.h>
2. int main()
3. {
4. char ch='n';
5. while(ch='y')
6. {
7. printf("hello");
8. }
9. return 0;
10. }
251 | P a g e
In the above code, we use the assignment operator (ch='y') which leads to the execution of loop
infinite number of times.
o We use the wrong loop condition which causes the loop to be executed indefinitely.
1. #include <stdio.h>
2. int main()
3. {
4. for(int i=1;i>=1;i++)
5. {
6. printf("hello");
7. }
8. return 0;
9. }
The above code will execute the 'for loop' infinite number of times. As we put the condition (i>=1),
which will always be true for every condition, it means that "hello" will be printed infinitely.
o We should be careful when we are using the break keyword in the nested loop because it will terminate
the execution of the nearest loop, not the entire loop.
1. #include <stdio.h>
2. int main()
3. {
4. while(1)
5. {
6. for(int i=1;i<=10;i++)
7. {
8. if(i%2==0)
9. {
10. break;
11. }
12. }
13. }
14. return 0;
15. }
252 | P a g e
In the above code, the while loop will be executed an infinite number of times as we use the break
keyword in an inner loop. This break keyword will bring the control out of the inner loop, not from the
outer loop.
o We should be very careful when we are using the floating-point value inside the loop as we cannot
underestimate the floating-point errors.
1. #include <stdio.h>
2. int main()
3. {
4. float x = 3.0;
5. while (x != 4.0) {
6. printf("x = %f\n", x);
7. x += 0.1;
8. }
9. return 0;
10. }
In the above code, the loop will run infinite times as the computer represents a floating-point value as
a real value. The computer will represent the value of 4.0 as 3.999999 or 4.000001, so the condition
(x !=4.0) will never be false. The solution to this problem is to write the condition as (k<=4.0).
Infinite loops can cause problems if it is not properly controlled or designed, leading to
excessive CPU resource consumption and unresponsiveness in programs or systems. Implementing
mechanisms to break out of infinite loops is crucial when necessary.
It is advisable to include exit conditions within the loop to prevent unintentional infinite loops. These
conditions can be based on user input, specific events or flags, or time limits. The loop will
terminate by incorporating appropriate exit conditions after fulfilling its purpose or meeting specific
criteria.
Add a termination condition: Make sure the loop has a condition that can ultimately evaluate
to false, allowing it to end.
253 | P a g e
Employ a counter: Establish a cap on the number of iterations and implement a counter that
increases with each loop iteration. Thus, even if the required condition is not satisfied, the loop will
ultimately come to an end.
Introduce a timeout system: If the time limit is reached, the loop will be stopped. Use a timer or
system functions to measure the amount of time that has passed.
Use external or user-provided triggers: Design the loop to end in response to certain user input or
outside events.
In certain cases, infinite loops may be intentionally employed in specialized algorithms or system-
level operations. For instance, real-time systems or embedded systems utilize infinite loops to
monitor inputs or execute specific tasks continuously. However, care must be taken to manage
such loops properly, avoiding any adverse effects on system performance or responsiveness.
ADVERTISEMENT
Modern programming languages and development frameworks often offer built-in mechanisms to
handle infinite loops more efficiently. For example, Graphical user interface (GUI)
frameworks provide event-driven architectures where programs wait for user input or system events,
eliminating the need for explicit infinite loops.
It is essential to exercise caution and discretion when using infinite loops. They should only be
employed when there is a clear and valid reason for an indefinite running loop, and adequate
safeguards must be implemented to prevent any negative impact on the program or system.
Conclusion:
In conclusion, an infinite loop in C constitutes a looping construct that never ends and keeps running
forever. Different loop structures, such as the for loop, while loop, do-while loop, goto statement,
or C macros, can be used to produce it. Operating systems, servers, and video games all frequently
employ infinite loops since they demand constant human input and output until manual termination.
On the other hand, the unintentional infinite loops might happen because of code flaws, which are
difficult to identify, especially for newcomers.
Careful consideration of semicolons, logical criteria, and loop termination requirements is required
to prevent inadvertent infinite loops. Infinite loops can result from improper semicolon placement or
the use of assignment operators in place of relational operators. False loop conditions that always
evaluate to true may likewise result in an infinite loop. Furthermore, since the break keyword only
ends the closest loop, caution must be used when using it in nested loops. Furthermore, as they may
make the loop termination condition impossible to meet, floating-point mistakes should be
considered while working with floating-point numbers.
254 | P a g e
C break statement
The break is a keyword in C which is used to bring the program control out of the loop. The break
statement is used inside loops or switch statement. The break statement breaks the loop one by one,
i.e., in the case of nested loops, it breaks the inner loop first and then proceeds to outer loops. The
break statement in C can be used in the following two scenarios:
Syntax:
1. //loop or switch case
2. break;
Flowchart of break in c
Example
1. #include<stdio.h>
2. #include<stdlib.h>
3. void main ()
4. {
5. int i;
6. for(i = 0; i<10; i++)
7. {
255 | P a g e
8. printf("%d ",i);
9. if(i == 5)
10. break;
11. }
12. printf("came outside of loop i = %d",i);
13.
14. }
Output
o The loop (while or for) or the switch (or a series of "if-else" statements) begins execution.
o The program analyzes the condition within the "if" statement that includes the "break" statement
throughout each iteration of the loop or each check in the switch.
o If the condition is "true", the "break" statement is performed.
o When a "break" statement is found, the program immediately quits the loop or switch block, skipping
any remaining iterations or checks.
o The program continues to execute the code following the loop or switch
Note: The "break" statement only affects the innermost loop or switch block which is contained
within the statement. If there are nested loops or switch statements, the nearest one that includes
the "break" statement will be broken out of.
Without the "break" statement, the loop or switch would continue its normal execution and process
all the remaining iterations or checks, even if the desired condition has already been met. The "break"
statement provides an efficient way to exit loops or switch blocks when you no longer need to
perform further iterations or checks.
256 | P a g e
Use of break statements in different cases with
their examples:
Let us go through each use case of the "break" statement in C with detailed explanations and
examples:
o Simple Loops
o Nested Loops
o Infinite Loops
o Switch case
1. Simple Loops:
When a specific condition is fulfilled, the "break" statement is widely used in simple loops
like "while" and "for" to stop the loop early. It is helpful when you wish to terminate the loop early
due to a condition.
Syntax:
While loop
1. while (condition) {
2. // Code block inside the loop
3. if (some_condition) {
4. break; // Exit the loop if this condition is met
5. }
6. // Rest of the loop's code
7. }
For loop
257 | P a g e
7. }
Example:
Let's take an example to understand the use of the break statement in simple loops in C:
Output
1 2 3 4
Explanation:
In this example, the "while" loop outputs the digits 1 through 4. When i equals 5, the "if" condition
if (i == 5) is true, and the "break" expression is performed, forcing the loop to finish early.
2. Nested Loops:
The break statement can be applied in nested loops to break out of the inner and outer loops
simultaneously when a specific condition is met. It allows you to stop processing further iterations
in multiple loops at once.
Syntax:
258 | P a g e
2. // Code block of the outer loop
3. for (inner_loop_initialization; inner_loop_condition; inner_loop_increment) {
4. // Code block of the inner loop
5. if (some_condition) {
6. break; // Exit both inner and outer loops if this condition is met
7. }
8. // Rest of the inner loop's code
9. }
10. // Rest of the outer loop's code
11. }
Example:
Let's take an example to understand the use of the break statement in nested loops in C:
Output
Explanation:
259 | P a g e
In this example, the nested loops output pairs of integers ranging from 1 to
3. When i equals 2 and j equals 2, the "if" condition if (i == 2 && j == 2) is true, and
the "break" statement is run, causing both loops to end at the same time.
3. Infinite Loops:
An infinite loop runs continuously unless terminated by a "break" statement or another condition
within the loop. In infinite loops, the "break" statement is typically used to give a means to leave
the loop based on specified criteria.
Syntax:
Example:
Let's take an example to understand the use of the break statement in infinite loops in C:
Explanation:
In this example, the program keeps asking the user to enter a number in an infinite loop. If the user
enters 0, the "if" condition if (number == 0) is true, and the "break" statement is executed, ending
the loop and terminating the program.
4. Switch Case:
The "break" statement is used in a "switch" statement to exit the switch block after a particular
case is executed. Without the "break" statement, the program would continue executing the code
for all the subsequent cases, potentially leading to unexpected behavior.
Syntax:
1. switch (expression) {
2. case value1:
3. // Code block for case value1
4. break; // Exit the switch block after executing this case
5. case value2:
6. // Code block for case value2
7. break; // Exit the switch block after executing this case
8. // More cases...
9. default:
10. // Code block for the default case
11. break; // Exit the switch block after executing this case
12. }
Example:
Let's take an example to understand the use of the break statement in the switch case in C:
Menu:
Option 1
Option 2
Quit
Enter your choice: 2
You selected Option 2
Menu:
Option 1
Option 2
Quit
262 | P a g e
Enter your choice: 4
Invalid choice. Try one more time.
Explanation:
In this case, the program presents a menu & prompts the user to select an option. The
matching "case" block is run based on the user's input. After the execution of the
corresponding "case" block, the "break" statement exits the switch block, preventing the program
from executing the code for other cases.
These are the different ways you can use the "break" statement in C to control the flow of your
program within loops and switch statements. The "break" statement provides a powerful mechanism
to exit loops and switch blocks when certain conditions are met, making your code more efficient and
functional.
o Loop termination: The break statement allows you to exit a loop prematurely based on a specific
condition. It can help you save execution time by avoiding unnecessary iterations when the desired
condition has been met. It provides a way to break out of nested loops as well.
o Switch statement termination: In C, the break statement is commonly used within a switch statement
to terminate the execution of the entire switch block. Without the break statement, execution would
continue to the next case, potentially leading to unintended behavior.
o Enhanced control flow: By using the break statement, you have fine-grained control over the flow of
your program. It allows you to conditionally exit loops or switch statements based on specific criteria,
providing flexibility and control.
o Code organization and readability: Properly using break statements can lead to cleaner & more
readable code. It lets you convey your goal by exiting a loop when a given condition is fulfilled, making
the code easier to understand & maintain.
o Error handling: The break statement can be helpful in error-handling scenarios. For example, if
an error condition arises during a loop iteration, you may use the break to quit the loop and handle
the problem correctly.
o Efficiency: When dealing with large loops or switch statements, using the break statement can
improve the efficiency of your code. Terminating the loop or switching early unnecessary computations
can be avoided, leading to faster execution.
263 | P a g e
Note: Excessive use of break statements can sometimes make code harder to understand and
maintain, mainly when it is used in nested loops. It's essential to use break judiciously and
consider other control flow options, such as continuing or restructuring your code when
appropriate.
264 | P a g e
C continue statement
The continue statement in C language is used to bring the program control to the beginning of the
loop. The continue statement skips some lines of code inside the loop and continues with the next
iteration. It is mainly used for a condition so that we can skip some code for a particular condition.
Syntax:
1. //loop statements
2. continue;
3. //some lines of the code which is to be skipped
Continue statement example 1
1. #include<stdio.h>
2. void main ()
3. {
4. int i = 0;
5. while(i!=10)
6. {
7. printf("%d", i);
8. continue;
9. i++;
10. }
11. }
Output
infinite loop
265 | P a g e
11. return 0;
12. }
Output
1
2
3
4
6
7
8
9
10
As you can see, 5 is not printed on the console because loop is continued at i==5.
1. #include<stdio.h>
2. int main(){
3. int i=1,j=1;//initializing a local variable
4. for(i=1;i<=3;i++){
5. for(j=1;j<=3;j++){
6. if(i==2 && j==2){
7. continue;//will continue loop of j only
8. }
9. printf("%d %d\n",i,j);
10. }
11. }//end of for loop
12. return 0;
13. }
Output
1 1
1 2
1 3
2 1
2 3
3 1
3 2
3 3
266 | P a g e
As you can see, 2 2 is not printed on the console because inner loop is continued at i==2 and j==2.
C goto statement
The goto statement is known as jump statement in C. As the name suggests, goto is used to transfer
the program control to a predefined label. The goto statment can be used to repeat some part of the
code for a particular condition. It can also be used to break the multiple loops which can't be done by
using a single break statement. However, using goto is avoided these days since it makes the program
less readable and complecated.
Syntax:
1. label:
2. //some part of the code;
3. goto label;
goto example
Let's see a simple example to use goto statement in C language.
1. #include <stdio.h>
2. int main()
3. {
4. int num,i=1;
5. printf("Enter the number whose table you want to print?");
6. scanf("%d",&num);
7. table:
8. printf("%d x %d = %d\n",num,i,num*i);
9. i++;
10. if(i<=10)
11. goto table;
12. }
Output:
267 | P a g e
10 x 8 = 80
10 x 9 = 90
10 x 10 = 100
1. #include <stdio.h>
2. int main()
3. {
4. int i, j, k;
5. for(i=0;i<10;i++)
6. {
7. for(j=0;j<5;j++)
8. {
9. for(k=0;k<3;k++)
10. {
11. printf("%d %d %d\n",i,j,k);
12. if(j == 3)
13. {
14. goto out;
15. }
16. }
17. }
18. }
19. out:
20. printf("came out of the loop");
21. }
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
0 3 0
came out of the loop
268 | P a g e
Type Casting in C
Data types are crucial in determining the nature and behavior of variables in the realm of
programming. Typecasting allows us to convert one data type into another. This procedure is called
type casting, and the C programming language offers it as a useful tool. In this blog, we will examine
the syntax, practical applications, and advantages of typecasting in C.
The procedure of changing a variable's data type is known as type casting. It can be helpful in a
variety of situations, for as when processing user input, doing mathematical calculations,
or interacting with other libraries that need data types. In C language, we use cast operator for
typecasting which is denoted by (type).
Syntax:
1. (type)value;
Note: It is always recommended to convert the lower value to higher to avoid data loss.
int f= 9/4;
Implicit Casting:
When the compiler automatically transforms the data from one type to another, it is referred to
as implicit casting or automated type conversion. This casting is based on a set of guidelines that
outline how various kinds of data can coexist. As an illustration, the automated conversion of
an integer to a float, which occurs without any explicit instructions, is an example of an implicit cast.
Implicit casting doesn't require any special syntax because the compiler takes care of it.
Example:
269 | P a g e
1. #include <stdio.h>
2.
3. int main() {
4. int num1 = 10;
5. float num2 = 5.5;
6. float result;
7.
8. result = num1 + num2; // Implicit cast from int to float
9.
10. printf("The result is: %f\n", result);
11.
12. return 0;
13. }
Output:
Explanation:
In the example above, the integer value num1 is added to the float variable num2 after being
implicitly cast to a float. The result variable contains a float value representing the outcome.
Explicit Casting:
Using the cast operator, explicit casting entails explicitly changing one data type to another. It
needs explicit instructions in the code and allows the programmer control over type conversion.
Syntax:
1. (type) expression
Here, expression is the value or variable that is to be cast, and (type) stands for the required data
type.
Example:
1. #include <stdio.h>
2.
3. int main() {
4. float num1 = 15.6;
270 | P a g e
5. int num2;
6.
7. num2 = (int) num1; // Explicit cast from float to int
8.
9. printf("The result is: %d\n", num2);
10.
11. return 0;
12. }
Output:
ADVERTISEMENT
Explanation:
This example uses the (int) syntax to explicitly cast the float variable num1 to an integer. After
truncating the fractional portion, we get the integer value and that value is assigned to the num2
variable.
Narrowing Conversion:
ADVERTISEMENT
ADVERTISEMENT
When a value is converted to a data type with a narrower range or precision, it is said to
be narrowing transformed, which may result in data loss. If it is not handled appropriately, it may
lead to unexpected behavior and needs explicit casting.
Example:
1. #include <stdio.h>
2.
3. int main() {
4. double num1 = 1234.56789;
5. int num2;
6.
7. num2 = (int) num1; // Narrowing conversion from double to int
8.
9. printf("The result is: %d\n", num2);
10.
271 | P a g e
11. return 0;
12. }
Output:
Explanation:
This example narrows the conversion by explicitly casting the double value num1 to an integer.
The integer value is sent to the num2 variable, and the fractional portion is eliminated.
Widening Conversion:
When a value is converted to a data type with a wider range or greater accuracy, this process is
called widening conversion. Since it occurs implicitly, casting is not necessary.
Example:
1. #include <stdio.h>
2.
3. int main() {
4. int num1 = 10;
5. double num2;
6.
7. num2 = num1; // Widening conversion from int to double
8. printf("The result is: %f\n", num2);
9.
10.
11.
12. return 0;
13.
14. }
Output:
Explanation:
272 | P a g e
In this example, the assignment to the num2 variable results in an implicit conversion of
the integer value num1 to a double. A double with the same numerical value as the initial integer is
the outcome.
Precision Control:
Type casting enables programmers to exert precise control over the accuracy of calculations. They
can alter the decimal places, eliminate the fractional component, or get more precise answers by
converting variables to various data types.
Data Compatibility:
When using external libraries or APIs, type casting is essential for assuring data compatibility.
Specific data types are expected as input arguments by many libraries or functions. Programmers
may easily link their code with these external components using type casting, facilitating effective
data transmission and interoperability.
Greater Flexibility:
Type casting allows for greater adaptability when managing user input. Programmers can convert a
string to the necessary data type for additional processing or validation, for instance, when accepting
input as a string. With more robust input processing and improved error checking made possible by
this flexibility, programs are more dependable.
By downsizing variables to smaller data types where it is feasible, type casting enables programmers
to efficiently use memory. For instance, type casting can assist conserve memory if an integer value
can be securely stored in a smaller data type like char or short. This benefit becomes more significant
in systems with limited resources when memory efficiency is crucial.
Code Reusability:
By enabling programmers to employ functions or components created for a single data type with
various data types, type casting enhances code reusability. They may reuse existing code and
prevent duplication by casting variables effectively, cutting down on development time and effort.
Error Handling:
273 | P a g e
Error management and detection can benefit from type casting. An error or exception can be
produced. For example, if a conversion fails owing to incompatible data types, giving the chance to
resolve the circumstance graciously. During the development and testing phases, this error detection
technique aids in locating and fixing any problems.
Casting explicitly in C serves as a reminder of the possibility of data loss during conversions.
Programmers must be mindful of the destination type's constrained range or precision when
converting a variable to a smaller data type. They can assess the effect on data integrity and, if
necessary, create suitable error handling procedures by explicitly casting the variable.
Enhancing Performance:
By executing some processes more efficiently, type casting can occasionally increase performance. For
instance, explicit casting can aid the compiler in producing more effective machine code, leading to
quicker execution, when dealing with complicated expressions containing mixed data types.
Conclusion:
As a result, type casting in C is a potent feature that provides accuracy control, data compatibility,
flexibility, memory optimization, code reuse, error handling, protection of data loss, and
possible speed gains. Programmers may fine-tune computations, interact with external components,
manage user input, optimize memory use, ensure code reuse, find mistakes, avoid data loss, and
boost efficiency by changing variables from one data type to another. Type casting must be used
carefully to guarantee data integrity and program stability. Programmers can improve the
functionality and performance of their programs by having a solid grasp of typecasting in C.
C Functions
In c, we can divide a large program into the basic building blocks known as function. The function
contains the set of programming statements enclosed by {}. A function can be called multiple times to
provide reusability and modularity to the C program. In other words, we can say that the collection of
functions creates a program. The function is also known as procedureor subroutinein other
programming languages.
Advantage of functions in C
There are the following advantages of C functions.
o By using functions, we can avoid rewriting same logic/code again and again in a program.
o We can call C functions any number of times in a program and from any place in a program.
274 | P a g e
o We can track a large C program easily when it is divided into multiple functions.
o Reusability is the main achievement of C functions.
o However, Function calling is always a overhead in a C program.
Function Aspects
There are three aspects of a C function.
o Function declaration A function must be declared globally in a c program to tell the compiler about
the function name, function parameters, and return type.
o Function call Function can be called from anywhere in the program. The parameter list must not differ
in function calling and function declaration. We must pass the same number of functions as it is
declared in the function declaration.
o Function definition It contains the actual statements which are to be executed. It is the most important
aspect to which the control comes when the function is called. Here, we must notice that only one value
can be returned from the function.
Types of Functions
There are two types of functions in C programming:
275 | P a g e
1. Library Functions: are the functions which are declared in the C header files such as scanf(), printf(),
gets(), puts(), ceil(), floor() etc.
2. User-defined functions: are the functions which are created by the C programmer, so that he/she can
use it many times. It reduces the complexity of a big program and optimizes the code.
Return Value
A C function may or may not return a value from the function. If you don't have to return any value
from the function, use void for the return type.
Let's see a simple example of C function that doesn't return any value from the function.
1. void hello(){
2. printf("hello c");
3. }
If you want to return any value from the function, you need to use any data type such as int, long,
char, etc. The return type depends on the value to be returned from the function.
Let's see a simple example of C function that returns int value from the function.
1. int get(){
2. return 10;
276 | P a g e
3. }
In the above example, we have to return 10 as a value, so the return type is int. If you want to return
floating-point value (e.g., 10.2, 3.1, 54.5, etc), you need to use float as the return type of the method.
1. float get(){
2. return 10.2;
3. }
Now, you need to call the function, to get the value of the function.
1. #include<stdio.h>
2. void printName();
3. void main ()
4. {
5. printf("Hello ");
6. printName();
7. }
8. void printName()
9. {
10. printf("Javatpoint");
11. }
Output
Hello Javatpoint
277 | P a g e
Example 2
1. #include<stdio.h>
2. void sum();
3. void main()
4. {
5. printf("\nGoing to calculate the sum of two numbers:");
6. sum();
7. }
8. void sum()
9. {
10. int a,b;
11. printf("\nEnter two numbers");
12. scanf("%d %d",&a,&b);
13. printf("The sum is %d",a+b);
14. }
Output
The sum is 34
1. #include<stdio.h>
2. int sum();
3. void main()
4. {
5. int result;
6. printf("\nGoing to calculate the sum of two numbers:");
7. result = sum();
8. printf("%d",result);
9. }
10. int sum()
11. {
278 | P a g e
12. int a,b;
13. printf("\nEnter two numbers");
14. scanf("%d %d",&a,&b);
15. return a+b;
16. }
Output
ADVERTISEMENT
The sum is 34
1. #include<stdio.h>
2. int sum();
3. void main()
4. {
5. printf("Going to calculate the area of the square\n");
6. float area = square();
7. printf("The area of the square: %f\n",area);
8. }
9. int square()
10. {
11. float side;
12. printf("Enter the length of the side in meters: ");
13. scanf("%f",&side);
14. return side * side;
15. }
Output
ADVERTISEMENT
279 | P a g e
Example 1
1. #include<stdio.h>
2. void sum(int, int);
3. void main()
4. {
5. int a,b,result;
6. printf("\nGoing to calculate the sum of two numbers:");
7. printf("\nEnter two numbers:");
8. scanf("%d %d",&a,&b);
9. sum(a,b);
10. }
11. void sum(int a, int b)
12. {
13. printf("\nThe sum is %d",a+b);
14. }
Output
The sum is 34
1. #include<stdio.h>
2. void average(int, int, int, int, int);
3. void main()
4. {
5. int a,b,c,d,e;
6. printf("\nGoing to calculate the average of five numbers:");
7. printf("\nEnter five numbers:");
8. scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
9. average(a,b,c,d,e);
10. }
11. void average(int a, int b, int c, int d, int e)
12. {
280 | P a g e
13. float avg;
14. avg = (a+b+c+d+e)/5;
15. printf("The average of given five numbers : %f",avg);
16. }
Output
1. #include<stdio.h>
2. int sum(int, int);
3. void main()
4. {
5. int a,b,result;
6. printf("\nGoing to calculate the sum of two numbers:");
7. printf("\nEnter two numbers:");
8. scanf("%d %d",&a,&b);
9. result = sum(a,b);
10. printf("\nThe sum is : %d",result);
11. }
12. int sum(int a, int b)
13. {
14. return a+b;
15. }
Output
281 | P a g e
1. #include<stdio.h>
2. int even_odd(int);
3. void main()
4. {
5. int n,flag=0;
6. printf("\nGoing to check whether a number is even or odd");
7. printf("\nEnter the number: ");
8. scanf("%d",&n);
9. flag = even_odd(n);
10. if(flag == 0)
11. {
12. printf("\nThe number is odd");
13. }
14. else
15. {
16. printf("\nThe number is even");
17. }
18. }
19. int even_odd(int n)
20. {
21. if(n%2 == 0)
22. {
23. return 1;
24. }
25. else
26. {
27. return 0;
28. }
29. }
Output
282 | P a g e
C Library Functions
Library functions are the inbuilt function in C that are grouped and placed at a common place called
the library. Such functions are used to perform some specific operations. For example, printf is a
library function used to print on the console. The library functions are created by the designers of
compilers. All C standard library functions are defined inside the different header files saved with the
extension .h. We need to include these header files in our program to make use of the library
functions defined in such header files. For example, To use the library functions such as printf/scanf
we need to include stdio.h in our program which is a header file that contains all the library functions
regarding standard input/output.
The list of mostly used header files is given in the following table.
S Header Description
N file
1 stdio.h This is a standard input/output header file. It contains all the library functions regarding
standard input/output.
3 string.h It contains all string related library functions like gets(), puts(),etc.
4 stdlib.h This header file contains all the general library functions like malloc(), calloc(), exit(), etc.
5 math.h This header file contains all the math operations related functions like sqrt(), pow(), etc.
9 signal.h All the signal handling functions are defined in this header file.
283 | P a g e
12 errno.h This file contains error handling functions.
Modular Programming: The ability to divide a huge program into smaller, more manageable
modules is one of the main benefits of utilizing functions in C. Each function might contain a
particular job or component of functionality, which streamlines and clarifies the overall program
structure. This modular strategy improves code reuse and makes maintenance and debugging easier.
Code reuse: By using functions, you may create a certain algorithm or piece of logic only once and
utilize it repeatedly throughout your program. You may just call the function anytime you need to run
the code, saving you from having to duplicate it elsewhere. It not only speeds up development but
also assures consistency and lessens the possibility of making mistakes.
Easy Program Maintenance: A program may be understood and maintained more easily if it is
divided into smaller functions. The ability to assign a specific responsibility to each function makes
code more readable and makes troubleshooting and debugging easier. You may concentrate on the
necessary function without impacting other portions of the program if an error is found or a
modification is needed.
Improved Collaboration: Functions allow developers working on the same project to collaborate.
The program may be divided into functions so that several team members can work on different
functions at once. Developers may smoothly integrate their work into the functions if the interfaces
are well specified, which improves productivity and promotes effective development.
Passing the parameter: You can send arguments or data to a function in C so that it can process
them. The function can carry out actions and generate outcomes using these inputs. You may increase
the flexibility and adaptability of functions by passing parameters, which will increase your program's
overall versatility.
Return Values: Functions can send values back to the code that called them, allowing for the
communication of the function's execution results. You can utilize the returned value in other areas of
the program after doing calculations or data manipulation within the function. Return values are
284 | P a g e
especially helpful when you need to calculate a result or establish a condition depending on the
function's output.
Conclusion:
In conclusion, functions are essential to C programming because they give program organization,
reusability, and modularity. Developers can avoid repeatedly creating the same code by breaking
up huge programs into smaller functions, making the code more effective and simpler to maintain.
Anywhere in the program can call a function, providing flexibility and improving control flow.
The declaration, call, and definition of functions are only a few of their many characteristics. The
compiler is informed by the function declaration of the name, arguments, and return type. It is
possible to call a function with or without parameters and with or without a return value.
Programmers construct user-defined functions to improve the readability and optimization of their
code, whereas C library functions like printf() and scanf() provide preset capabilities.
Overall, functions are crucial building blocks in C programming, providing benefits including
increased organization, code reuse, and simple tracking of huge programs. Function calls could add
some overhead, but their advantages outweigh the minimal performance hit. Programmers may write
effective and modular C programs by comprehending and using functions.
Let's understand call by value and call by reference in c language one by one.
Call by value in C
o In call by value method, the value of the actual parameters is copied into the formal parameters. In
other words, we can say that the value of the variable is used in the function call in the call by value
method.
o In call by value method, we can not modify the value of the actual parameter by the formal parameter.
o In call by value, different memory is allocated for actual and formal parameters since the value of the
actual parameter is copied into the formal parameter.
285 | P a g e
o The actual parameter is the argument which is used in the function call whereas formal parameter is the
argument which is used in the function definition.
Let's try to understand the concept of call by value in c language by the example given below:
1. #include<stdio.h>
2. void change(int num) {
3. printf("Before adding value inside function num=%d \n",num);
4. num=num+100;
5. printf("After adding value inside function num=%d \n", num);
6. }
7. int main() {
8. int x=100;
9. printf("Before function call x=%d \n", x);
10. change(x);//passing value in function
11. printf("After function call x=%d \n", x);
12. return 0;
13. }
Output
Before function call x=100
Before adding value inside function num=100
After adding value inside function num=200
After function call x=100
286 | P a g e
13. int temp;
14. temp = a;
15. a=b;
16. b=temp;
17. printf("After swapping values in function a = %d, b = %d\n",a,b); // Formal parameters, a = 20, b = 10
18. }
Output
Before swapping the values in main a = 10, b = 20
After swapping values in function a = 20, b = 10
After swapping values in main a = 10, b = 20
Call by reference in C
o In call by reference, the address of the variable is passed into the function call as the actual parameter.
o The value of the actual parameters can be modified by changing the formal parameters since the
address of the actual parameters is passed.
o In call by reference, the memory allocation is similar for both formal parameters and actual parameters.
All the operations in the function are performed on the value stored at the address of the actual
parameters, and the modified value gets stored at the same address.
1. #include<stdio.h>
2. void change(int *num) {
3. printf("Before adding value inside function num=%d \n",*num);
4. (*num) += 100;
5. printf("After adding value inside function num=%d \n", *num);
6. }
7. int main() {
8. int x=100;
9. printf("Before function call x=%d \n", x);
10. change(&x);//passing reference in function
11. printf("After function call x=%d \n", x);
12. return 0;
13. }
Output
Before function call x=100
Before adding value inside function num=100
After adding value inside function num=200
After function call x=200
287 | P a g e
Call by reference Example: Swapping the values of the two variables
1. #include <stdio.h>
2. void swap(int *, int *); //prototype of the function
3. int main()
4. {
5. int a = 10;
6. int b = 20;
7. printf("Before swapping the values in main a = %d, b = %d\n",a,b); // printing the value of a and b in main
8. swap(&a,&b);
9. printf("After swapping values in main a = %d, b = %d\n",a,b); // The values of actual parameters do change i
n call by reference, a = 10, b = 20
10. }
11. void swap (int *a, int *b)
12. {
13. int temp;
14. temp = *a;
15. *a=*b;
16. *b=temp;
17. printf("After swapping values in function a = %d, b = %d\n",*a,*b); // Formal parameters, a = 20, b = 10
18. }
Output
Before swapping the values in main a = 10, b = 20
After swapping values in function a = 20, b = 10
After swapping values in main a = 20, b = 10
1 A copy of the value is passed into the function An address of value is passed into the function
2 Changes made inside the function is limited to the Changes made inside the function validate outside
function only. The values of the actual parameters of the function also. The values of the actual
do not change by changing the formal parameters do change by changing the formal
parameters. parameters.
288 | P a g e
3 Actual and formal arguments are created at the Actual and formal arguments are created at the
different memory location same memory location
Recursion in C
Recursion is the process which comes into existence when a function calls a copy of itself to work on a
smaller problem. Any function which calls itself is called recursive function, and such function calls are
called recursive calls. Recursion involves several numbers of recursive calls. However, it is important to
impose a termination condition of recursion. Recursion code is shorter than iterative code however it
is difficult to understand.
Recursion cannot be applied to all the problem, but it is more useful for the tasks that can be defined
in terms of similar subtasks. For Example, recursion may be applied to sorting, searching, and traversal
problems.
Generally, iterative solutions are more efficient than recursion since function call is always overhead.
Any problem that can be solved recursively, can also be solved iteratively. However, some problems
are best suited to be solved by the recursion, for example, tower of Hanoi, Fibonacci series, factorial
finding, etc.
1. #include <stdio.h>
2. int fact (int);
3. int main()
4. {
5. int n,f;
6. printf("Enter the number whose factorial you want to calculate?");
7. scanf("%d",&n);
8. f = fact(n);
9. printf("factorial = %d",f);
10. }
11. int fact(int n)
12. {
13. if (n==0)
14. {
15. return 0;
16. }
17. else if ( n == 1)
289 | P a g e
18. {
19. return 1;
20. }
21. else
22. {
23. return n*fact(n-1);
24. }
25. }
Output
Enter the number whose factorial you want to calculate?5
factorial = 120
We can understand the above program of the recursive method call by the figure given below:
Recursive Function
A recursive function performs the tasks by dividing it into the subtasks. There is a termination
condition defined in the function which is satisfied by some specific subtask. After this, the recursion
stops and the final result is returned from the function.
The case at which the function doesn't recur is called the base case whereas the instances where the
function keeps calling itself to perform a subtask, is called the recursive case. All the recursive
functions can be written using this format.
1. if (test_for_base)
2. {
3. return some_value;
4. }
5. else if (test_for_another_base)
6. {
7. return some_another_value;
8. }
9. else
10. {
11. // Statements;
12. recursive call;
290 | P a g e
13. }
Example of recursion in C
Let's see an example to find the nth term of the Fibonacci series.
1. #include<stdio.h>
2. int fibonacci(int);
3. void main ()
4. {
5. int n,f;
6. printf("Enter the value of n?");
7. scanf("%d",&n);
8. f = fibonacci(n);
9. printf("%d",f);
10. }
11. int fibonacci (int n)
12. {
13. if (n==0)
14. {
15. return 0;
16. }
17. else if (n == 1)
18. {
19. return 1;
20. }
21. else
22. {
23. return fibonacci(n-1)+fibonacci(n-2);
24. }
25. }
Output
Enter the value of n?12
144
Let us consider the following example to understand the memory allocation of the recursive functions.
Explanation
Let us examine this recursive function for n = 4. First, all the stacks are maintained which prints the
corresponding value of n until n becomes 0, Once the termination condition is reached, the stacks get
destroyed one by one by returning 0 to its calling stack. Consider the following image for more
information regarding the stack trace for the recursive functions.
Storage Classes in C
Storage classes in C are used to determine the lifetime, visibility, memory location, and initial value of
a variable. There are four types of storage classes in C
o Automatic
o External
o Static
o Register
292 | P a g e
Value
extern RAM Zero Global Till the end of the main program Maybe declared
anywhere in the program
static RAM Zero Local Till the end of the main program, Retains value
between multiple functions call
Automatic
o Automatic variables are allocated memory automatically at runtime.
o The visibility of the automatic variables is limited to the block in which they are defined.
The scope of the automatic variables is limited to the block in which they are defined.
o The automatic variables are initialized to garbage by default.
o The memory assigned to automatic variables gets freed upon exiting from the block.
o The keyword used for defining automatic variables is auto.
o Every local variable is automatic in C by default.
Example 1
1. #include <stdio.h>
2. int main()
3. {
4. int a; //auto
5. char b;
6. float c;
7. printf("%d %c %f",a,b,c); // printing initial default value of automatic variables a, b, and c.
8. return 0;
9. }
Output:
293 | P a g e
2. int main()
3. {
4. int a = 10,i;
5. printf("%d ",++a);
6. {
7. int a = 20;
8. for (i=0;i<3;i++)
9. {
10. printf("%d ",a); // 20 will be printed 3 times since it is the local value of a
11. }
12. }
13. printf("%d ",a); // 11 will be printed since the scope of a = 20 is ended.
14. }
Output:
11 20 20 20 11
Static
o The variables defined as static specifier can hold their value between the multiple function calls.
o Static local variables are visible only to the function or the block in which they are defined.
o A same static variable can be declared many times but can be assigned at only one time.
o Default initial value of the static integral variable is 0 otherwise null.
o The visibility of the static global variable is limited to the file in which it has declared.
o The keyword used to define static variable is static.
Example 1
1. #include<stdio.h>
2. static char c;
3. static int i;
4. static float f;
5. static char s[100];
6. void main ()
7. {
8. printf("%d %d %f %s",c,i,f); // the initial default value of c, i, and f will be printed.
9. }
Output:
294 | P a g e
0 0 0.000000 (null)
Example 2
1. #include<stdio.h>
2. void sum()
3. {
4. static int a = 10;
5. static int b = 24;
6. printf("%d %d \n",a,b);
7. a++;
8. b++;
9. }
10. void main()
11. {
12. int i;
13. for(i = 0; i< 3; i++)
14. {
15. sum(); // The static variables holds their value between multiple function calls.
16. }
17. }
Output:
10 24
11 25
12 26
Register
o The variables defined as the register is allocated the memory into the CPU registers depending upon
the size of the memory remaining in the CPU.
o We can not dereference the register variables, i.e., we can not use &operator for the register variable.
o The access time of the register variables is faster than the automatic variables.
o The initial default value of the register local variables is 0.
o The register keyword is used for the variable which should be stored in the CPU register. However, it is
compiler?s choice whether or not; the variables can be stored in the register.
o We can store pointers into the register, i.e., a register can store the address of a variable.
o Static variables can not be stored into the register since we can not use more than one storage specifier
for the same variable.
295 | P a g e
Example 1
1. #include <stdio.h>
2. int main()
3. {
4. register int a; // variable a is allocated memory in the CPU register. The initial default value of a is 0.
5. printf("%d",a);
6. }
Output:
0
Example 2
1. #include <stdio.h>
2. int main()
3. {
4. register int a = 0;
5. printf("%u",&a); // This will give a compile time error since we can not access the address of a register variable.
6. }
Output:
External
o The external storage class is used to tell the compiler that the variable defined as extern is declared with
an external linkage elsewhere in the program.
o The variables declared as extern are not allocated any memory. It is only declaration and intended to
specify that the variable is declared elsewhere in the program.
o The default initial value of external integral type is 0 otherwise null.
o We can only initialize the extern variable globally, i.e., we can not initialize the external variable within
any block or method.
o An external variable can be declared many times but can be initialized at only once.
o If a variable is declared as external then the compiler searches for that variable to be initialized
somewhere in the program which may be extern or static. If it is not, then the compiler will show an
error.
296 | P a g e
Example 1
1. #include <stdio.h>
2. int main()
3. {
4. extern int a;
5. printf("%d",a);
6. }
Output
Output
0
Example 3
1. #include <stdio.h>
2. int a;
3. int main()
4. {
5. extern int a = 0; // this will show a compiler error since we can not use extern and initializer at same time
6. printf("%d",a);
7. }
Output
Output
20
Example 5
1. extern int a;
2. int a = 10;
3. #include <stdio.h>
4. int main()
5. {
6. printf("%d",a);
7. }
8. int a = 20; // compiler will show an error at this line
Output
298 | P a g e
C Array
An array is defined as the collection of similar type of data items stored at contiguous memory
locations. Arrays are the derived data type in C programming language which can store the primitive
type of data such as int, char, double, float, etc. It also has the capability to store the collection of
derived data types, such as pointers, structure, etc. The array is the simplest data structure where each
data element can be randomly accessed by using its index number.
C array is beneficial if you have to store similar elements. For example, if we want to store the marks
of a student in 6 subjects, then we don't need to define different variables for the marks in the
different subject. Instead of that, we can define an array which can store the marks in each subject at
the contiguous memory locations.
By using the array, we can access the elements easily. Only a few lines of code are required to access
the elements of the array.
Properties of Array
The array contains the following properties.
o Each element of an array is of same data type and carries the same size, i.e., int = 4 bytes.
o Elements of the array are stored at contiguous memory locations where the first element is stored at
the smallest memory location.
o Elements of the array can be randomly accessed since we can calculate the address of each element of
the array with the given base address and the size of the data element.
299 | P a g e
Advantage of C Array
1) Code Optimization: Less code to the access the data.
2) Ease of traversing: By using the for loop, we can retrieve the elements of an array easily.
3) Ease of sorting: To sort the elements of the array, we need a few lines of code only.
4) Random Access: We can access any element randomly using the array.
Disadvantage of C Array
1) Fixed Size: Whatever size, we define at the time of declaration of the array, we can't exceed the
limit. So, it doesn't grow the size dynamically like LinkedList which we will learn later.
Declaration of C Array
We can declare an array in the c language in the following way.
1. data_type array_name[array_size];
1. int marks[5];
Here, int is the data_type, marks are the array_name, and 5 is the array_size.
Initialization of C Array
The simplest way to initialize an array is by using the index of each element. We can initialize each
element of the array by using the index. Consider the following example.
1. marks[0]=80;//initialization of array
2. marks[1]=60;
3. marks[2]=70;
4. marks[3]=85;
5. marks[4]=75;
300 | P a g e
C array example
1. #include<stdio.h>
2. int main(){
3. int i=0;
4. int marks[5];//declaration of array
5. marks[0]=80;//initialization of array
6. marks[1]=60;
7. marks[2]=70;
8. marks[3]=85;
9. marks[4]=75;
10. //traversal of array
11. for(i=0;i<5;i++){
12. printf("%d \n",marks[i]);
13. }//end of for loop
14. return 0;
15. }
Output
80
60
70
85
75
1. int marks[5]={20,30,40,50,60};
In such case, there is no requirement to define the size. So it may also be written as the following
code.
301 | P a g e
1. int marks[]={20,30,40,50,60};
1. #include<stdio.h>
2. int main(){
3. int i=0;
4. int marks[5]={20,30,40,50,60};//declaration and initialization of array
5. //traversal of array
6. for(i=0;i<5;i++){
7. printf("%d \n",marks[i]);
8. }
9. return 0;
10. }
Output
20
30
40
50
60
1. #include<stdio.h>
2. void main ()
3. {
4. int i, j,temp;
5. int a[10] = { 10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
6. for(i = 0; i<10; i++)
7. {
8. for(j = i+1; j<10; j++)
9. {
10. if(a[j] > a[i])
11. {
12. temp = a[i];
13. a[i] = a[j];
14. a[j] = temp;
302 | P a g e
15. }
16. }
17. }
18. printf("Printing Sorted Element List ...\n");
19. for(i = 0; i<10; i++)
20. {
21. printf("%d\n",a[i]);
22. }
23. }
Program to print the largest and second largest element of
the array.
1. #include<stdio.h>
2. void main ()
3. {
4. int arr[100],i,n,largest,sec_largest;
5. printf("Enter the size of the array?");
6. scanf("%d",&n);
7. printf("Enter the elements of the array?");
8. for(i = 0; i<n; i++)
9. {
10. scanf("%d",&arr[i]);
11. }
12. largest = arr[0];
13. sec_largest = arr[1];
14. for(i=0;i<n;i++)
15. {
16. if(arr[i]>largest)
17. {
18. sec_largest = largest;
19. largest = arr[i];
20. }
21. else if (arr[i]>sec_largest && arr[i]!=largest)
22. {
23. sec_largest=arr[i];
24. }
25. }
303 | P a g e
26. printf("largest = %d, second largest = %d",largest,sec_largest);
27.
28. }
1. data_type array_name[rows][columns];
1. int twodimen[4][3];
Initialization of 2D Array in C
In the 1D array, we don't need to specify the size of the array if the declaration and initialization are
being done simultaneously. However, this will not work with 2D arrays. We will have to define at least
the second dimension of the array. The two-dimensional array can be declared and defined in the
following way.
1. int arr[4][3]={{1,2,3},{2,3,4},{3,4,5},{4,5,6}};
Two-dimensional array example in C
1. #include<stdio.h>
2. int main(){
3. int i=0,j=0;
4. int arr[4][3]={{1,2,3},{2,3,4},{3,4,5},{4,5,6}};
5. //traversing 2D array
6. for(i=0;i<4;i++){
7. for(j=0;j<3;j++){
8. printf("arr[%d] [%d] = %d \n",i,j,arr[i][j]);
304 | P a g e
9. }//end of j
10. }//end of i
11. return 0;
12. }
Output
arr[0][0] = 1
arr[0][1] = 2
arr[0][2] = 3
arr[1][0] = 2
arr[1][1] = 3
arr[1][2] = 4
arr[2][0] = 3
arr[2][1] = 4
arr[2][2] = 5
arr[3][0] = 4
arr[3][1] = 5
arr[3][2] = 6
305 | P a g e
21. }
22. }
Output
Enter a[0][0]: 56
Enter a[0][1]: 10
Enter a[0][2]: 30
Enter a[1][0]: 34
Enter a[1][1]: 21
Enter a[1][2]: 34
Enter a[2][0]: 45
Enter a[2][1]: 56
Enter a[2][2]: 78
56 10 30
34 21 34
45 56 78
Return an Array in C
What is an Array?
An array is a type of data structure that stores a fixed-size of a homogeneous collection of data. In
short, we can say that array is a collection of variables of the same type.
For example, if we want to declare 'n' number of variables, n1, n2...n., if we create all these variables
individually, then it becomes a very tedious task. In such a case, we create an array of variables having
the same type. Each element of an array can be accessed using an index of the element.
1. #include <stdio.h>
2. void getarray(int arr[])
3. {
4. printf("Elements of array are : ");
5. for(int i=0;i<5;i++)
6. {
7. printf("%d ", arr[i]);
8. }
9. }
306 | P a g e
10. int main()
11. {
12. int arr[5]={45,67,34,78,90};
13. getarray(arr);
14. return 0;
15. }
In the above program, we have first created the array arr[] and then we pass this array to the function
getarray(). The getarray() function prints all the elements of the array arr[].
Output
1. #include <stdio.h>
2. void printarray(char *arr)
3. {
4. printf("Elements of array are : ");
5. for(int i=0;i<5;i++)
6. {
7. printf("%c ", arr[i]);
8. }
9. }
10. int main()
11. {
12. char arr[5]={'A','B','C','D','E'};
13. printarray(arr);
307 | P a g e
14. return 0;
15. }
In the above code, we have passed the array to the function as a pointer. The
function printarray() prints the elements of an array.
Output
Note: From the above examples, we observe that array is passed to a function as a reference
which means that array also persist outside the function.
1. #include <stdio.h>
2. int *getarray()
3. {
4. int arr[5];
5. printf("Enter the elements in an array : ");
6. for(int i=0;i<5;i++)
7. {
8. scanf("%d", &arr[i]);
9. }
10. return arr;
11. }
12. int main()
13. {
14. int *n;
15. n=getarray();
16. printf("\nElements of array are :");
308 | P a g e
17. for(int i=0;i<5;i++)
18. {
19. printf("%d", n[i]);
20. }
21. return 0;
22. }
In the above program, getarray() function returns a variable 'arr'. It returns a local variable, but it is an
illegal memory location to be returned, which is allocated within a function in the stack. Since the
program control comes back to the main() function, and all the variables in a stack are freed.
Therefore, we can say that this program is returning memory location, which is already de-allocated,
so the output of the program is a segmentation fault.
Output
309 | P a g e
Returning array by passing an array which is to be returned as a parameter to the function.
1. #include <stdio.h>
2. int *getarray(int *a)
3. {
4.
5. printf("Enter the elements in an array : ");
6. for(int i=0;i<5;i++)
7. {
8. scanf("%d", &a[i]);
9. }
10. return a;
11. }
12. int main()
13. {
14. int *n;
15. int a[5];
16. n=getarray(a);
17. printf("\nElements of array are :");
18. for(int i=0;i<5;i++)
19. {
20. printf("%d", n[i]);
21. }
310 | P a g e
22. return 0;
23. }
Output
1. #include <stdio.h>
2. #include<malloc.h>
3. int *getarray()
4. {
5. int size;
6. printf("Enter the size of the array : ");
7. scanf("%d",&size);
8. int *p= malloc(sizeof(size));
9. printf("\nEnter the elements in an array");
10. for(int i=0;i<size;i++)
11. {
12. scanf("%d",&p[i]);
13. }
14. return p;
15. }
16. int main()
17. {
18. int *ptr;
19. ptr=getarray();
20. int length=sizeof(*ptr);
311 | P a g e
21. printf("Elements that you have entered are : ");
22. for(int i=0;ptr[i]!='\0';i++)
23. {
24. printf("%d ", ptr[i]);
25. }
26. return 0;
27. }
Output
1. #include <stdio.h>
2. int *getarray()
3. {
4. static int arr[7];
5. printf("Enter the elements in an array : ");
6. for(int i=0;i<7;i++)
7. {
8. scanf("%d",&arr[i]);
9. }
10. return arr;
11.
12. }
13. int main()
14. {
15. int *ptr;
16. ptr=getarray();
17. printf("\nElements that you have entered are :");
18. for(int i=0;i<7;i++)
312 | P a g e
19. {
20. printf("%d ", ptr[i]);
21. }
22. }
In the above code, we have created the variable arr[] as static in getarray() function, which is
available throughout the program. Therefore, the function getarray() returns the actual memory
location of the variable 'arr'.
Output
Using Structure
The structure is a user-defined data type that can contain a collection of items of different types. Now, we will
create a program that returns an array by using structure.
1. #include <stdio.h>
2. #include<malloc.h>
3. struct array
4. {
5. int arr[8];
6. };
7. struct array getarray()
8. {
9. struct array y;
10. printf("Enter the elements in an array : ");
11. for(int i=0;i<8;i++)
12. {
13. scanf("%d",&y.arr[i]);
14. }
15. return y;
313 | P a g e
16. }
17. int main()
18. {
19. struct array x=getarray();
20. printf("Elements that you have entered are :");
21. for(int i=0;x.arr[i]!='\0';i++)
22. {
23. printf("%d ", x.arr[i]);
24. }
25. return 0;
26. }
Output
As we know that the array_name contains the address of the first element. Here, we must notice that
we need to pass only the name of the array in the function which is intended to accept an array. The
array defined as the formal parameter will automatically refer to the array specified by the array name
defined as an actual parameter.
First way:
Second way:
Third way:
You can also use the concept of a pointer. In pointer chapter, we will learn about it.
Output
minimum number is 3
316 | P a g e
28. }
Output
Returning an array is similar to passing the array into the function. The name of the array is returned
from the function. To make a function returning an array, the following syntax is used.
1. int * Function_name() {
2. //some statements;
3. return array_type;
4. }
To store the array returned from the function, we can define a pointer which points to that array. We
can traverse the array by increasing that pointer since pointer initially points to the base address of
the array. Consider the following example that contains a function returning the sorted array.
1. #include<stdio.h>
2. int* Bubble_Sort(int[]);
3. void main ()
4. {
5. int arr[10] = { 10, 9, 7, 101, 23, 44, 12, 78, 34, 23};
6. int *p = Bubble_Sort(arr), i;
7. printf("printing sorted elements ...\n");
8. for(i=0;i<10;i++)
9. {
10. printf("%d\n",*(p+i));
317 | P a g e
11. }
12. }
13. int* Bubble_Sort(int a[]) //array a[] points to arr.
14. {
15. int i, j,temp;
16. for(i = 0; i<10; i++)
17. {
18. for(j = i+1; j<10; j++)
19. {
20. if(a[j] < a[i])
21. {
22. temp = a[i];
23. a[i] = a[j];
24. a[j] = temp;
25. }
26. }
27. }
28. return a;
29. }
Output
C Pointers
The pointer in C language is a variable which stores the address of another variable. This variable can
be of type int, char, array, function, or any other pointer. The size of the pointer depends on the
architecture. However, in 32-bit architecture the size of a pointer is 2 byte.
Consider the following example to define a pointer which stores the address of an integer.
1. int n = 10;
318 | P a g e
2. int* p = &n; // Variable p of type pointer is pointing to the address of the variable n of type integer.
Declaring a pointer
The pointer in c language can be declared using * (asterisk symbol). It is also known as indirection
pointer used to dereference a pointer.
As you can see in the above figure, pointer variable stores the address of number variable, i.e., fff4.
The value of number variable is 50. But the address of pointer variable p is aaa3.
By the help of * (indirection operator), we can print the value of pointer variable p.
Let's see the pointer example as explained for the above figure.
1. #include<stdio.h>
2. int main(){
3. int number=50;
4. int *p;
5. p=&number;//stores the address of number variable
6. printf("Address of p variable is %x \n",p); // p contains the address of the number therefore printing p gives the
address of number.
7. printf("Value of p variable is %d \n",*p); // As we know that * is used to dereference a pointer therefore if we pri
nt *p, we will get the value stored at the address contained by p.
319 | P a g e
8. return 0;
9. }
Output
Pointer to array
1. int arr[10];
2. int *p[10]=&arr; // Variable p of type pointer is pointing to the address of an integer array arr.
Pointer to a function
1. void show (int);
2. void(*p)(int) = &display; // Pointer p is pointing to the address of a function
Pointer to structure
1. struct st {
2. int i;
3. float f;
4. }ref;
5. struct st *p = &ref;
Advantage of pointer
1) Pointer reduces the code and improves the performance, it is used to retrieving strings, trees,
etc. and used with arrays, structures, and functions.
3) It makes you able to access any memory location in the computer's memory.
Usage of pointer
There are many applications of pointers in c language.
320 | P a g e
In c language, we can dynamically allocate memory using malloc() and calloc() functions where the
pointer is used.
Pointers in c language are widely used in arrays, functions, and structures. It reduces the code and
improves the performance.
1. #include<stdio.h>
2. int main(){
3. int number=50;
4. printf("value of number is %d, address of number is %u",number,&number);
5. return 0;
6. }
Output
NULL Pointer
A pointer that is not assigned any value but NULL is known as the NULL pointer. If you don't have any
address to be specified in the pointer at the time of declaration, you can assign NULL value. It will
provide a better approach.
int *p=NULL;
321 | P a g e
6. *p1=*p1+*p2;
7. *p2=*p1-*p2;
8. *p1=*p1-*p2;
9. printf("\nAfter swap: *p1=%d *p2=%d",*p1,*p2);
10.
11. return 0;
12. }
Output
Data type 3 -
o (): This operator is a bracket operator used to declare and define the function.
o []: This operator is an array subscript operator
o * : This operator is a pointer operator.
o Identifier: It is the name of the pointer. The priority will always be assigned to this.
o Data type: Data type is the type of the variable to which the pointer is intended to point. It also includes
the modifier like signed int, long, etc).
322 | P a g e
To read the pointer, we must see that () and [] have the equal precedence. Therefore, their
associativity must be considered here. The associativity is left to right, so the priority goes to ().
Inside the bracket (), pointer operator * and pointer name (identifier) p have the same precedence.
Therefore, their associativity must be considered here which is right to left, so the priority goes to p,
and the second priority goes to *.
Assign the 3rd priority to [] since the data type has the last precedence. Therefore the pointer will look
like following.
o char -> 4
o * -> 2
o p -> 1
o [10] -> 3
Example
323 | P a g e
The syntax of declaring a double pointer is given below.
1. #include<stdio.h>
2. void main ()
3. {
4. int a = 10;
5. int *p;
6. int **pp;
7. p = &a; // pointer p is pointing to the address of a
8. pp = &p; // pointer pp is a double pointer pointing to the address of pointer p
9. printf("address of a: %x\n",p); // Address of a will be printed
10. printf("address of p: %x\n",pp); // Address of p will be printed
11. printf("value stored at p: %d\n",*p); // value stoted at the address contained by p i.e. 10 will be printed
12. printf("value stored at pp: %d\n",**pp); // value stored at the address contained by the pointer stoyred at pp
13. }
Output
address of a: d26a8734
address of p: d26a8738
value stored at p: 10
value stored at pp: 10
As you can see in the above figure, p2 contains the address of p (fff2), and p contains the address of
number variable (fff4).
1. #include<stdio.h>
324 | P a g e
2. int main(){
3. int number=50;
4. int *p;//pointer to int
5. int **p2;//pointer to pointer
6. p=&number;//stores the address of number variable
7. p2=&p;
8. printf("Address of number variable is %x \n",&number);
9. printf("Address of p variable is %x \n",p);
10. printf("Value of *p variable is %d \n",*p);
11. printf("Address of p2 variable is %x \n",p2);
12. printf("Value of **p2 variable is %d \n",*p);
13. return 0;
14. }
Output
Address of number variable is fff4
Address of p variable is fff4
Value of *p variable is 50
Address of p2 variable is fff2
Value of **p variable is 50
325 | P a g e
Explanation
In the above question, the pointer arithmetic is used with the double pointer. An array of 6 elements
is defined which is pointed by an array of pointer p. The pointer array p is pointed by a double pointer
pp. However, the above image gives you a brief idea about how the memory is being allocated to the
array a and the pointer array p. The elements of p are the pointers that are pointing to every element
of the array a. Since we know that the array name contains the base address of the array hence, it will
work as a pointer and can the value can be traversed by using *(a), *(a+1), etc. As shown in the image,
a[0] can be accessed in the following ways.
o a[0]: it is the simplest way to access the first element of the array
o *(a): since a store the address of the first element of the array, we can access its value by using
indirection pointer on it.
o *p[0]: if a[0] is to be accessed by using a pointer p to it, then we can use indirection operator (*) on the
first element of the pointer array p, i.e., *p[0].
o **(pp): as pp stores the base address of the pointer array, *pp will give the value of the first element of
the pointer array that is the address of the first element of the integer array. **p will give the actual
value of the first element of the integer array.
Coming to the program, Line 1 and 2 declare the integer and pointer array relatively. Line 3 initializes
the double pointer to the pointer array p. As shown in the image, if the address of the array starts
from 200 and the size of the integer is 2, then the pointer array will contain the values as 200, 202,
326 | P a g e
204, 206, 208, 210. Let us consider that the base address of the pointer array is 300; the double
pointer pp contains the address of pointer array, i.e., 300. Line number 4 increases the value of pp by
1, i.e., pp will now point to address 302.
Line number 5 contains an expression which prints three values, i.e., pp - p, *pp - a, **pp. Let's
calculate them each one of them.
o pp = 302, p = 300 => pp-p = (302-300)/2 => pp-p = 1, i.e., 1 will be printed.
o pp = 302, *pp = 202, a = 200 => *pp - a = 202 - 200 = 2/2 = 1, i.e., 1 will be printed.
o pp = 302, *pp = 202, *(*pp) = 206, i.e., 206 will be printed.
Therefore as the result of line 5, The output 1, 1, 206 will be printed on the console. On line 6, *pp++
is written. Here, we must notice that two unary operators * and ++ will have the same precedence.
Therefore, by the rule of associativity, it will be evaluated from right to left. Therefore the expression
*pp++ can be rewritten as (*(pp++)). Since, pp = 302 which will now become, 304. *pp will give 204.
On line 7, again the expression is written which prints three values, i.e., pp-p, *pp-a, *pp. Let's
calculate each one of them.
o pp = 304, p = 300 => pp - p = (304 - 300)/2 => pp-p = 2, i.e., 2 will be printed.
o pp = 304, *pp = 204, a = 200 => *pp-a = (204 - 200)/2 = 2, i.e., 2 will be printed.
o pp = 304, *pp = 204, *(*pp) = 300, i.e., 300 will be printed.
Therefore, as the result of line 7, The output 2, 2, 300 will be printed on the console. On line 8, ++*pp
is written. According to the rule of associativity, this can be rewritten as, (++(*(pp))). Since, pp = 304,
*pp = 204, the value of *pp = *(p[2]) = 206 which will now point to a[3].
On line 9, again the expression is written which prints three values, i.e., pp-p, *pp-a, *pp. Let's
calculate each one of them.
o pp = 304, p = 300 => pp - p = (304 - 300)/2 => pp-p = 2, i.e., 2 will be printed.
o pp = 304, *pp = 206, a = 200 => *pp-a = (206 - 200)/2 = 3, i.e., 3 will be printed.
o pp = 304, *pp = 206, *(*pp) = 409, i.e., 409 will be printed.
Therefore, as the result of line 9, the output 2, 3, 409 will be printed on the console. On line 10, +
+**pp is writen. according to the rule of associativity, this can be rewritten as, (++(*(*(pp)))). pp = 304,
*pp = 206, **pp = 409, ++**pp => *pp = *pp + 1 = 410. In other words, a[3] = 410.
On line 11, again the expression is written which prints three values, i.e., pp-p, *pp-a, *pp. Let's
calculate each one of them.
327 | P a g e
o pp = 304, p = 300 => pp - p = (304 - 300)/2 => pp-p = 2, i.e., 2 will be printed.
o pp = 304, *pp = 206, a = 200 => *pp-a = (206 - 200)/2 = 3, i.e., 3 will be printed.
o On line 8, **pp = 410.
Therefore as the result of line 9, the output 2, 3, 410 will be printed on the console.
Output
1 1 206
2 2 300
2 3 409
2 3 410
Pointer Arithmetic in C
We can perform arithmetic operations on the pointers like addition, subtraction, etc. However, as we
know that pointer contains the address, the result of an arithmetic operation performed on the
pointer will also be a pointer if the other operand is of type integer. In pointer-from-pointer
subtraction, the result will be an integer value. Following arithmetic operations are possible on the
pointer in C language:
o Increment
o Decrement
o Addition
o Subtraction
o Comparison
Incrementing Pointer in C
If we increment a pointer by 1, the pointer will start pointing to the immediate next location. This is
somewhat different from the general arithmetic since the value of the pointer will get increased by
the size of the data type to which the pointer is pointing.
We can traverse an array by using the increment operation on a pointer which will keep pointing to
every element of the array, perform some operation on that, and update itself in a loop.
328 | P a g e
Where i is the number by which the pointer get increased.
32-bit
For 32-bit int variable, it will be incremented by 2 bytes.
64-bit
For 64-bit int variable, it will be incremented by 4 bytes.
1. #include<stdio.h>
2. int main(){
3. int number=50;
4. int *p;//pointer to int
5. p=&number;//stores the address of number variable
6. printf("Address of p variable is %u \n",p);
7. p=p+1;
8. printf("After increment: Address of p variable is %u \n",p); // in our case, p will get incremented by 4 bytes.
9. return 0;
10. }
Output
329 | P a g e
12. }
Output
Decrementing Pointer in C
Like increment, we can decrement a pointer variable. If we decrement a pointer, it will start pointing
to the previous location. The formula of decrementing the pointer is given below:
64-bit
For 64-bit int variable, it will be decremented by 4 bytes.
1. #include <stdio.h>
2. void main(){
3. int number=50;
4. int *p;//pointer to int
5. p=&number;//stores the address of number variable
6. printf("Address of p variable is %u \n",p);
7. p=p-1;
8. printf("After decrement: Address of p variable is %u \n",p); // P will now point to the immidiate previous locatio
n.
9. }
Output
C Pointer Addition
We can add a value to the pointer variable. The formula of adding value to pointer is given below:
330 | P a g e
1. new_address= current_address + (number * size_of(data type))
32-bit
For 32-bit int variable, it will add 2 * number.
64-bit
Let's see the example of adding value to pointer variable on 64-bit architecture.
1. #include<stdio.h>
2. int main(){
3. int number=50;
4. int *p;//pointer to int
5. p=&number;//stores the address of number variable
6. printf("Address of p variable is %u \n",p);
7. p=p+3; //adding 3 to pointer variable
8. printf("After adding 3: Address of p variable is %u \n",p);
9. return 0;
10. }
Output
As you can see, the address of p is 3214864300. But after adding 3 with p variable, it is 3214864312,
i.e., 4*3=12 increment. Since we are using 64-bit architecture, it increments 12. But if we were using
32-bit architecture, it was incrementing to 6 only, i.e., 2*3=6. As integer value occupies 2-byte
memory in 32-bit OS.
C Pointer Subtraction
Like pointer addition, we can subtract a value from the pointer variable. Subtracting any number from
a pointer will give an address. The formula of subtracting value from the pointer variable is given
below:
331 | P a g e
32-bit
For 32-bit int variable, it will subtract 2 * number.
64-bit
For 64-bit int variable, it will subtract 4 * number.
Let's see the example of subtracting value from the pointer variable on 64-bit architecture.
1. #include<stdio.h>
2. int main(){
3. int number=50;
4. int *p;//pointer to int
5. p=&number;//stores the address of number variable
6. printf("Address of p variable is %u \n",p);
7. p=p-3; //subtracting 3 from pointer variable
8. printf("After subtracting 3: Address of p variable is %u \n",p);
9. return 0;
10. }
Output
You can see after subtracting 3 from the pointer variable, it is 12 (4*3) less than the previous address
value.
However, instead of subtracting a number, we can also subtract an address from another address
(pointer). This will result in a number. It will not be a simple arithmetic operation, but it will follow the
following rule.
1. Address2 - Address1 = (Subtraction of two addresses)/size of data type which pointer points
1. #include<stdio.h>
2. void main ()
3. {
332 | P a g e
4. int i = 100;
5. int *p = &i;
6. int *temp;
7. temp = p;
8. p = p + 3;
9. printf("Pointer Subtraction: %d - %d = %d",p, temp, p-temp);
10. }
Output
Pointer to function in C
As we discussed in the previous chapter, a pointer can point to a function in C. However, the
declaration of the pointer variable must be the same as the function. Consider the following example
to make a pointer pointing to the function.
1. #include<stdio.h>
2. int addition ();
3. int main ()
4. {
5. int result;
6. int (*ptr)();
333 | P a g e
7. ptr = &addition;
8. result = (*ptr)();
9. printf("The sum is %d",result);
10. }
11. int addition()
12. {
13. int a, b;
14. printf("Enter two numbers?");
15. scanf("%d %d",&a,&b);
16. return a+b;
17. }
Output
1. #include<stdio.h>
2. int show();
3. int showadd(int);
4. int (*arr[3])();
5. int (*(*ptr)[3])();
6.
7. int main ()
8. {
9. int result1;
10. arr[0] = show;
11. arr[1] = showadd;
12. ptr = &arr;
13. result1 = (**ptr)();
14. printf("printing the value returned by show : %d",result1);
15. (*(*ptr+1))(result1);
334 | P a g e
16. }
17. int show()
18. {
19. int a = 65;
20. return a++;
21. }
22. int showadd(int b)
23. {
24. printf("\nAdding 90 to the value returned by show: %d",b+90);
25. }
Output
Dangling Pointers in C
The most common bugs related to pointers and memory management is dangling/wild pointers.
Sometimes the programmer fails to initialize the pointer with a valid address, then this type of
initialized pointer is known as a dangling pointer in C.
Dangling pointer occurs at the time of the object destruction when the object is deleted or de-
allocated from memory without modifying the value of the pointer. In this case, the pointer is
pointing to the memory, which is de-allocated. The dangling pointer can point to the memory, which
contains either the program code or the code of the operating system. If we assign the value to this
pointer, then it overwrites the value of the program code or operating system instructions; in such
cases, the program will show the undesirable result or may even crash. If the memory is re-allocated
to some other process, then we dereference the dangling pointer will cause the segmentation faults.
335 | P a g e
In the above figure, we can observe that the Pointer 3 is a dangling pointer. Pointer 1 and Pointer
2 are the pointers that point to the allocated objects, i.e., Object 1 and Object 2, respectively. Pointer
3 is a dangling pointer as it points to the de-allocated object.
1. #include <stdio.h>
2. int main()
3. {
4. int *ptr=(int *)malloc(sizeof(int));
5. int a=560;
6. ptr=&a;
7. free(ptr);
8. return 0;
9. }
In the above code, we have created two variables, i.e., *ptr and a where 'ptr' is a pointer and 'a' is a
integer variable. The *ptr is a pointer variable which is created with the help of malloc() function. As
we know that malloc() function returns void, so we use int * to convert void pointer into int pointer.
The statement int *ptr=(int *)malloc(sizeof(int)); will allocate the memory with 4 bytes shown in the
below image:
336 | P a g e
The statement free(ptr) de-allocates the memory as shown in the below image with a cross sign, and
'ptr' pointer becomes dangling as it is pointing to the de-allocated memory.
If we assign the NULL value to the 'ptr', then 'ptr' will not point to the deleted memory. Therefore, we
can say that ptr is not a dangling pointer, as shown in the below image:
When the variable goes out of the scope then the pointer pointing to the variable becomes
a dangling pointer.
1. #include<stdio.h>
2. int main()
3. {
4. char *str;
5. {
6. char a = ?A?;
7. str = &a;
8. }
9. // a falls out of scope
10. // str is now a dangling pointer
11. printf("%s", *str);
12. }
Function call
Now, we will see how the pointer becomes dangling when we call the function.
1. #include <stdio.h>
2. int *fun(){
3. int y=10;
4. return &y;
5. }
6. int main()
7. {
8. int *p=fun();
9. printf("%d", *p);
10. return 0;
11. }
o First, we create the main() function in which we have declared 'p' pointer that contains the
return value of the fun().
o When the fun() is called, then the control moves to the context of the int
*fun(), the fun() returns the address of the 'y' variable.
o When control comes back to the context of the main() function, it means the variable 'y' is no
longer available. Therefore, we can say that the 'p' pointer is a dangling pointer as it points to
the de-allocated memory.
Output
338 | P a g e
Let's represent the working of the above code diagrammatically.
1. #include <stdio.h>
2. int *fun()
3. {
4. static int y=10;
5. return &y;
6. }
7. int main()
8. {
9. int *p=fun();
10. printf("%d", *p);
11. return 0;
12. }
The above code is similar to the previous one but the only difference is that the variable 'y' is static.
We know that static variable stores in the global memory.
Output
339 | P a g e
Now, we represent the working of the above code diagrammatically.
The above diagram shows the stack memory. First, the fun() function is called, then the control
moves to the context of the int *fun(). As 'y' is a static variable, so it stores in the global memory; Its
scope is available throughout the program. When the address value is returned, then the control
comes back to the context of the main(). The pointer 'p' contains the address of 'y', i.e., 100. When we
print the value of '*p', then it prints the value of 'y', i.e., 10. Therefore, we can say that the pointer 'p' is
not a dangling pointer as it contains the address of the variable which is stored in the global memory.
The dangling pointer errors can be avoided by initializing the pointer to the NULL value. If we assign
the NULL value to the pointer, then the pointer will not point to the de-allocated memory.
Assigning NULL value to the pointer means that the pointer is not pointing to any memory location.
sizeof() operator in C
The sizeof() operator is commonly used in C. It determines the size of the expression or the data type
specified in the number of char-sized storage units. The sizeof() operator contains a single operand
which can be either an expression or a data typecast where the cast is data type enclosed within
parenthesis. The data type cannot only be primitive data types such as integer or floating data types,
but it can also be pointer data types and compound data types such as unions and structs.
340 | P a g e
Need of sizeof() operator
Mainly, programs know the storage size of the primitive data types. Though the storage size of the
data type is constant, it varies when implemented in different platforms. For example, we dynamically
allocate the array space by using sizeof() operator:
1. int *ptr=malloc(10*sizeof(int));
In the above example, we use the sizeof() operator, which is applied to the cast of type int. We
use malloc() function to allocate the memory and returns the pointer which is pointing to this
allocated memory. The memory space is equal to the number of bytes occupied by the int data type
and multiplied by 10.
Note:
The output can vary on different machines such as on 32-bit operating system will show different
output, and the 64-bit operating system will show the different outputs of the same data types.
The sizeof() operator behaves differently according to the type of the operand.
In the above code, we are printing the size of different data types such as int, char, float with the help
of sizeof() operator.
Output
341 | P a g e
When operand is an expression
1. #include <stdio.h>
2. int main()
3. {
4. double i=78.0; //variable initialization.
5. float j=6.78; //variable initialization.
6. printf("size of (i+j) expression is : %d",sizeof(i+j)); //Displaying the size of the expression (i+j).
7. return 0;
8. }
In the above code, we have created two variables 'i' and 'j' of type double and float respectively, and
then we print the size of the expression by using sizeof(i+j) operator.
Output
For example:
1. #include <stdio.h>
2.
3. int main() {
4. int arr[] = {1, 2, 3, 4, 5};
5. int arrSize = sizeof(arr) / sizeof(arr[0]);
6.
7. printf("Size of the array arr is: %d\n", sizeof(arr));
8. printf("Number of elements in arr is: %d\n", arrSize);
342 | P a g e
9.
10. return 0;
11. }
Output
Sizeof(arr) returns the array's overall size in bytes, whereas sizeof(arr[0]) returns the array's smallest
element's size. The number of items in the array is determined by dividing the overall size by the size
of a single element (arrSize). By using this technique, the code will continue to be flexible in the
face of changing array sizes.
Similarly, you can use the sizeof() operator to figure out the size of structures:
1. #include <stdio.h>
2.
3. struct Person {
4. char name[30];
5. int age;
6. float salary;
7. };
8.
9. int main() {
10. struct Person p;
11.
12. printf("Size of the structure Person is: %d bytes\n", sizeof(p));
13.
14. return 0;
15. }
Output
343 | P a g e
Allocation of dynamic memory and pointer
arithmetic
Other applications of the sizeof() operator include pointer arithmetic and dynamic memory
allocation. Knowing the size of data types becomes essential when working
with arrays and pointers for correct memory allocation and element access.
1. #include <stdio.h>
2. #include <stdlib.h>
3.
4. int main() {
5. int *ptr;
6. int numElements = 5;
7.
8. ptr = (int*)malloc(numElements * sizeof(int));
9. if (ptr == NULL) {
10. printf("Memory allocation failed!\n");
11. return 1;
12. }
13.
14. for (int i = 0; i < numElements; i++) {
15. ptr[i] = i + 1;
16. }
17.
18. printf("Dynamic array elements: ");
19. for (int i = 0; i < numElements; i++) {
20. printf("%d ", ptr[i]);
21. }
22.
23. free(ptr); // Release allocated memory.
24.
25. return 0;
26. }
Output
344 | P a g e
Explanation:
In this example, a size numElements integer array has a memory that is dynamically
allocated. numElements * sizeof(int) bytes represent the total amount of memory allocated. By
doing this, the array is guaranteed to have enough room to accommodate the desired amount of
integers.
1. #include <stdio.h>
2.
3. union Data {
4. int i;
5. float f;
6. char str[20];
7. };
8.
9. int main() {
10. union Data data;
11.
12. printf("Size of the union Data is: %d bytes\n", sizeof(data));
13.
14. return 0;
15. }
Output
The sizeof() operator is extremely important since it's essential for memory
management, portability, and effective data handling. The sizeof() operator is crucial in C for the
reasons listed in the list below:
Memory Allocation: When working with arrays and dynamic memory allocation, the sizeof()
operator is frequently used in memory allocation. Knowing the size of data types when allocating
memory for arrays or structures guarantees that the correct amount of memory is reserved,
reducing memory overflows and improving memory utilization.
345 | P a g e
ADVERTISEMENT
ADVERTISEMENT
Portability: Since C is a popular programming language, code frequently has to operate on several
systems with differing architectures and data type sizes. As it specifies the size of data types at
compile-time, the sizeof() operator aids in designing portable code by enabling programs to adapt
automatically to various platforms.
Pointer Arithmetic: When dealing with pointers, the sizeof() operator aids in figuring out memory
offsets, allowing accurate movement within data structures, arrays, and other memory regions. It is
extremely helpful when iterating across arrays or dynamically allocated memory.
Handling Binary Data: The sizeof() operator guarantees that the right amount of data is read or
written when working with binary data or files, eliminating mistakes brought on by inaccurate data
size assumptions.
Unions and Structures: The sizeof() operator is essential when managing structures and unions,
especially when utilizing them to build complicated data structures. Memory allocation and access
become effective and error-free when you are aware of the size of structures and unions.
Safe Buffer Management: The sizeof() operator helps make sure that the buffer is big enough to
hold the data being processed while working with character arrays (strings), preventing buffer
overflows and potential security flaws.
Data Serialization and Deserialization: The sizeof() operator guarantees that the right amount of
data is handled, maintaining data integrity throughout data transfer or storage, in situations where
data needs to be serialized (converted to a byte stream) or deserialized (retrieved from a byte stream).
Code Improvement: Knowing the size of various data formats might occasionally aid in code
optimization. For instance, it enables the compiler to more effectively align data structures, reducing
memory waste and enhancing cache performance.
346 | P a g e
The program can adapt to many platforms without the need for manual modifications since it
supplies the size of data types at compile-time. Additionally, the sizeof() operator makes it possible
to navigate precisely around data structures and arrays while working with pointers, facilitating safe
and effective pointer arithmetic. Another application for the sizeof() operator is
handling unions and structures. It ensures precise memory allocation and access within
intricate data structures, preventing mistakes and inefficiencies. The sizeof() operator is a basic tool
that enables C programmers to develop effective, portable, and resilient code while optimizing
performance and data integrity. It ensures safe buffer management and makes data serialization and
deserialization easier.
Conclusion:
In summary, the C sizeof() operator is a useful tool for calculating the size of many sorts of objects,
including data types, expressions, arrays, structures, unions, and more. As it offers the size of data
types at compile-time, catering to multiple platforms and settings, it enables programmers to create
portable and flexible code. Developers may effectively handle memory allocation, pointer
arithmetic, and dynamic memory allocation in their programs by being aware of the storage needs
of various data types.
When working with arrays and structures, the sizeof() operator is very helpful since it ensures
proper memory allocation and makes it simple to retrieve elements. Additionally, it
facilitates pointer arithmetic, making it simpler to move between memory regions. However, because
of operator precedence, programmers should be cautious when utilizing complicated expressions
with sizeof() operator.
Overall, learning the sizeof() operator equips C programmers to create stable and adaptable software
solutions by enabling them to write efficient, dependable, and platform-independent code.
const Pointer in C
Constant Pointers
A constant pointer in C cannot change the address of the variable to which it is pointing, i.e., the
address will remain constant. Therefore, we can say that if a constant pointer is pointing to some
variable, then it cannot point to any other variable.
1. #include <stdio.h>
2. int main()
3. {
4. int a=1;
5. int b=2;
6. int *const ptr;
7. ptr=&a;
8. ptr=&b;
9. printf("Value of ptr is :%d",*ptr);
10. return 0;
11. }
Output
In the above output, we can observe that the above code produces the error "assignment of read-
only variable 'ptr'". It means that the value of the variable 'ptr' which 'ptr' is holding cannot be
changed. In the above code, we are changing the value of 'ptr' from &a to &b, which is not possible
with constant pointers. Therefore, we can say that the constant pointer, which points to some variable,
cannot point to another variable.
348 | P a g e
Pointer to Constant
A pointer to constant is a pointer through which the value of the variable that the pointer points
cannot be changed. The address of these pointers can be changed, but the value of the variable that
the pointer points cannot be changed.
o First, we write the code where we are changing the value of a pointer
1. #include <stdio.h>
2. int main()
3. {
4. int a=100;
5. int b=200;
6. const int* ptr;
7. ptr=&a;
8. ptr=&b;
9. printf("Value of ptr is :%u",ptr);
10. return 0;
11. }
o We declare two variables, i.e., a and b with the values 100 and 200 respectively.
o We declare a pointer to constant.
o First, we assign the address of variable 'a' to the pointer 'ptr'.
o Then, we assign the address of variable 'b' to the pointer 'ptr'.
o Lastly, we try to print the value of 'ptr'.
Output
349 | P a g e
The above code runs successfully, and it shows the value of 'ptr' in the output.
o Now, we write the code in which we are changing the value of the variable to which the pointer points.
1. #include <stdio.h>
2. int main()
3. {
4. int a=100;
5. int b=200;
6. const int* ptr;
7. ptr=&b;
8. *ptr=300;
9. printf("Value of ptr is :%d",*ptr);
10. return 0;
11. }
o We declare two variables, i.e., 'a' and 'b' with the values 100 and 200 respectively.
o We declare a pointer to constant.
o We assign the address of the variable 'b' to the pointer 'ptr'.
o Then, we try to modify the value of the variable 'b' through the pointer 'ptr'.
o Lastly, we try to print the value of the variable which is pointed by the pointer 'ptr'.
Output
The above code shows the error "assignment of read-only location '*ptr'". This error means that we
cannot change the value of the variable to which the pointer is pointing.
350 | P a g e
Constant Pointer to a Constant
A constant pointer to a constant is a pointer, which is a combination of the above two pointers. It can
neither change the address of the variable to which it is pointing nor it can change the value placed at
this address.
Syntax
1. const <type of pointer>* const <name of the pointer>;
1. #include <stdio.h>
2. int main()
3. {
4. int a=10;
5. int b=90;
6. const int* const ptr=&a;
7. *ptr=12;
8. ptr=&b;
9. printf("Value of ptr is :%d",*ptr);
10. return 0;
11. }
o We declare two variables, i.e., 'a' and 'b' with the values 10 and 90, respectively.
o We declare a constant pointer to a constant and then assign the address of 'a'.
o We try to change the value of the variable 'a' through the pointer 'ptr'.
o Then we try to assign the address of variable 'b' to the pointer 'ptr'.
o Lastly, we print the value of the variable, which is pointed by the pointer 'ptr'.
Output
351 | P a g e
The above code shows the error "assignment of read-only location '*ptr'" and "assignment of read-
only variable 'ptr'". Therefore, we conclude that the constant pointer to a constant can change neither
address nor value, which is pointing by this pointer.
void pointer in C
Till now, we have studied that the address assigned to a pointer should be of the same type as
specified in the pointer declaration. For example, if we declare the int pointer, then this int pointer
cannot point to the float variable or some other type of variable, i.e., it can point to only int type
variable. To overcome this problem, we use a pointer to void. A pointer to void means a generic
pointer that can point to any data type. We can assign the address of any data type to the void
pointer, and a void pointer can be assigned to any type of the pointer without performing any explicit
typecasting.
1. void *ptr;
In the above declaration, the void is the type of the pointer, and 'ptr' is the name of the pointer.
352 | P a g e
p=fp; // incorrect.
fp=&i; // incorrect
ptr=p; // correct
ptr=fp; // correct
ptr=&i; // correct
1. #include <stdio.h>
2. int main()
3. {
4. void *ptr = NULL; //void pointer
5. int *p = NULL;// integer pointer
6. char *cp = NULL;//character pointer
7. float *fp = NULL;//float pointer
8. //size of void pointer
9. printf("size of void pointer = %d\n\n",sizeof(ptr));
10. //size of integer pointer
11. printf("size of integer pointer = %d\n\n",sizeof(p));
12. //size of character pointer
13. printf("size of character pointer = %d\n\n",sizeof(cp));
14. //size of float pointer
15. printf("size of float pointer = %d\n\n",sizeof(fp));
16. return 0;
17. }
Output
353 | P a g e
Advantages of void pointer
Following are the advantages of a void pointer:
o The malloc() and calloc() function return the void pointer, so these functions can be used to allocate the
memory of any data type.
1. #include <stdio.h>
2. #include<malloc.h>
3. int main()
4. {
5. int a=90;
6.
7. int *x = (int*)malloc(sizeof(int)) ;
8. x=&a;
9. printf("Value which is pointed by x pointer : %d",*x);
10. return 0;
11. }
Output
o The void pointer in C can also be used to implement the generic functions in C.
The void pointer in C cannot be dereferenced directly. Let's see the below example.
354 | P a g e
1. #include <stdio.h>
2. int main()
3. {
4. int a=90;
5. void *ptr;
6. ptr=&a;
7. printf("Value which is pointed by ptr pointer : %d",*ptr);
8. return 0;
9. }
In the above code, *ptr is a void pointer which is pointing to the integer variable 'a'. As we already
know that the void pointer cannot be dereferenced, so the above code will give the compile-time
error because we are printing the value of the variable pointed by the pointer 'ptr' directly.
Output
1. #include <stdio.h>
2. int main()
3. {
4. int a=90;
5. void *ptr;
6. ptr=&a;
7. printf("Value which is pointed by ptr pointer : %d",*(int*)ptr);
8. return 0;
9. }
In the above code, we typecast the void pointer to the integer pointer by using the statement given
below:
355 | P a g e
(int*)ptr;
Then, we print the value of the variable which is pointed by the void pointer 'ptr' by using the
statement given below:
*(int*)ptr;
Output
We cannot apply the arithmetic operations on void pointers in C directly. We need to apply the
proper typecasting so that we can perform the arithmetic operations on the void pointers.
1. #include<stdio.h>
2. int main()
3. {
4. float a[4]={6.1,2.3,7.8,9.0};
5. void *ptr;
6. ptr=a;
7. for(int i=0;i<4;i++)
8. {
9. printf("%f,",*ptr);
10. ptr=ptr+1; // Incorrect.
11.
12. }}
The above code shows the compile-time error that "invalid use of void expression" as we cannot
apply the arithmetic operations on void pointer directly, i.e., ptr=ptr+1.
1. #include<stdio.h>
356 | P a g e
2. int main()
3. {
4. float a[4]={6.1,2.3,7.8,9.0};
5. void *ptr;
6. ptr=a;
7. for(int i=0;i<4;i++)
8. {
9. printf("%f,",*((float*)ptr+i));
10. }}
The above code runs successfully as we applied the proper casting to the void pointer, i.e., (float*)ptr
and then we apply the arithmetic operation, i.e., *((float*)ptr+i).
Output
1. #include<stdio.h>
2. int main()
3. {
4. int a=56; // initialization of a integer variable 'a'.
5. float b=4.5; // initialization of a float variable 'b'.
6. char c='k'; // initialization of a char variable 'c'.
7. void *ptr; // declaration of void pointer.
8. // assigning the address of variable 'a'.
9. ptr=&a;
10. printf("value of 'a' is : %d",*((int*)ptr));
11. // assigning the address of variable 'b'.
12. ptr=&b;
13. printf("\nvalue of 'b' is : %f",*((float*)ptr));
14. // assigning the address of variable 'c'.
357 | P a g e
15. ptr=&c;
16. printf("\nvalue of 'c' is : %c",*((char*)ptr));
17. return 0;
18. }
Output
C dereference pointer
As we already know that "what is a pointer", a pointer is a variable that stores the address of another
variable. The dereference operator is also known as an indirection operator, which is represented by
(*). When indirection operator (*) is used with the pointer variable, then it is known as dereferencing
a pointer. When we dereference a pointer, then the value of the variable pointed by this pointer will
be returned.
o It can be used to access or manipulate the data stored at the memory location, which is pointed by the
pointer.
o Any operation applied to the dereferenced pointer will directly affect the value of the variable that it
points to.
1. int x =9;
o Now, we declare the integer pointer variable.
1. int *ptr;
o After the declaration of an integer pointer variable, we store the address of 'x' variable to the pointer
variable 'ptr'.
358 | P a g e
1. ptr=&x;
o We can change the value of 'x' variable by dereferencing a pointer 'ptr' as given below:
1. *ptr =8;
The above line changes the value of 'x' variable from 9 to 8 because 'ptr' points to the 'x' location and
dereferencing of 'ptr', i.e., *ptr=8 will update the value of x.
1. #include <stdio.h>
2. int main()
3. {
4. int x=9;
5. int *ptr;
6. ptr=&x;
7. *ptr=8;
8. printf("value of x is : %d", x);
9. return 0;}
Output
1. #include <stdio.h>
2. int main()
3. {
4. int x=4;
5. int y;
6. int *ptr;
7. ptr=&x;
8. y=*ptr;
359 | P a g e
9. *ptr=5;
10. printf("The value of x is : %d",x);
11. printf("\n The value of y is : %d",y);
12. return 0;
13. }
o We declare two variables 'x' and 'y' where 'x' is holding a '4' value.
o We declare a pointer variable 'ptr'.
o After the declaration of a pointer variable, we assign the address of the 'x' variable to the pointer 'ptr'.
o As we know that the 'ptr' contains the address of 'x' variable, so '*ptr' is the same as 'x'.
o We assign the value of 'x' to 'y' with the help of 'ptr' variable, i.e., y=*ptr instead of using the 'x' variable.
Note: According to us, if we change the value of 'x', then the value of 'y' will also get changed as
the pointer 'ptr' holds the address of the 'x' variable. But this does not happen, as 'y' is storing the
local copy of value '5'.
Output
1. #include <stdio.h>
2. int main()
3. {
4. int a=90;
5. int *ptr1,*ptr2;
6. ptr1=&a;
7. ptr2=&a;
8. *ptr1=7;
9. *ptr2=6;
360 | P a g e
10. printf("The value of a is : %d",a);
11. return 0;
12. }
Note: If we have more than one pointer pointing to the same location, then the change made by
one pointer will be the same as another pointer.
Output
1. malloc()
2. calloc()
3. realloc()
4. free()
Before learning above functions, let's understand the difference between static memory allocation
and dynamic memory allocation.
361 | P a g e
memory can't be increased while executing program. memory can be increased while executing program.
Now let's have a quick look at the methods used for dynamic memory allocation.
malloc() function in C
The malloc() function allocates single block of requested memory.
1. ptr=(cast-type*)malloc(byte-size)
1. #include<stdio.h>
2. #include<stdlib.h>
3. int main(){
4. int n,i,*ptr,sum=0;
5. printf("Enter number of elements: ");
6. scanf("%d",&n);
7. ptr=(int*)malloc(n*sizeof(int)); //memory allocated using malloc
8. if(ptr==NULL)
9. {
10. printf("Sorry! unable to allocate memory");
362 | P a g e
11. exit(0);
12. }
13. printf("Enter elements of array: ");
14. for(i=0;i<n;++i)
15. {
16. scanf("%d",ptr+i);
17. sum+=*(ptr+i);
18. }
19. printf("Sum=%d",sum);
20. free(ptr);
21. return 0;
22. }
Output
calloc() function in C
The calloc() function allocates multiple block of requested memory.
1. ptr=(cast-type*)calloc(number, byte-size)
1. #include<stdio.h>
2. #include<stdlib.h>
3. int main(){
4. int n,i,*ptr,sum=0;
5. printf("Enter number of elements: ");
6. scanf("%d",&n);
7. ptr=(int*)calloc(n,sizeof(int)); //memory allocated using calloc
363 | P a g e
8. if(ptr==NULL)
9. {
10. printf("Sorry! unable to allocate memory");
11. exit(0);
12. }
13. printf("Enter elements of array: ");
14. for(i=0;i<n;++i)
15. {
16. scanf("%d",ptr+i);
17. sum+=*(ptr+i);
18. }
19. printf("Sum=%d",sum);
20. free(ptr);
21. return 0;
22. }
Output
realloc() function in C
If memory is not sufficient for malloc() or calloc(), you can reallocate the memory by realloc() function.
In short, it changes the memory size.
1. ptr=realloc(ptr, new-size)
free() function in C
The memory occupied by malloc() or calloc() functions must be released by calling free() function.
Otherwise, it will consume memory until program exit.
1. free(ptr)
364 | P a g e
C Strings
The string can be defined as the one-dimensional array of characters terminated by a null ('\0'). The
character array or the string is used to manipulate text such as word or sentences. Each character in
the array occupies one byte of memory, and the last character must always be 0. The termination
character ('\0') is important in a string since it is the only way to identify where the string ends. When
we define a string as char s[10], the character s[10] is implicitly initialized with the null in the memory.
1. By char array
2. By string literal
1. char ch[10]={'j', 'a', 'v', 'a', 't', 'p', 'o', 'i', 'n', 't', '\0'};
As we know, array index starts from 0, so it will be represented as in the figure given below.
While declaring string, size is not mandatory. So we can write the above code as given below:
1. char ch[]={'j', 'a', 'v', 'a', 't', 'p', 'o', 'i', 'n', 't', '\0'};
We can also define the string by the string literal in C language. For example:
1. char ch[]="javatpoint";
In such case, '\0' will be appended at the end of the string by the compiler.
o We need to add the null character '\0' at the end of the array by ourself whereas, it is appended
internally by the compiler in the case of the character array.
365 | P a g e
o The string literal cannot be reassigned to another set of characters whereas, we can reassign the
characters of the array.
String Example in C
Let's see a simple example where a string is declared and being printed. The '%s' is used as a format
specifier for the string in c language.
1. #include<stdio.h>
2. #include <string.h>
3. int main(){
4. char ch[11]={'j', 'a', 'v', 'a', 't', 'p', 'o', 'i', 'n', 't', '\0'};
5. char ch2[11]="javatpoint";
6.
7. printf("Char Array Value is: %s\n", ch);
8. printf("String Literal Value is: %s\n", ch2);
9. return 0;
10. }
Output
Traversing String
Traversing the string is one of the most important aspects in any of the programming languages. We
may need to manipulate a very large text which can be done by traversing the text. Traversing string
is somewhat different from the traversing an integer array. We need to know the length of the array
to traverse an integer array, whereas we may use the null character in the case of string to identify the
end the string and terminate the loop.
Output
1. #include<stdio.h>
2. void main ()
3. {
4. char s[11] = "javatpoint";
5. int i = 0;
6. int count = 0;
7. while(s[i] != NULL)
8. {
9. if(s[i]=='a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'u' || s[i] == 'o')
10. {
11. count ++;
12. }
13. i++;
14. }
367 | P a g e
15. printf("The number of vowels %d",count);
16. }
Output
1. #include<stdio.h>
2. void main ()
3. {
4. char s[20];
5. printf("Enter the string?");
6. scanf("%s",s);
7. printf("You entered %s",s);
8. }
Output
It is clear from the output that, the above code will not work for space separated strings. To make this
code working for the space separated strings, the minor changed required in the scanf function, i.e.,
instead of writing scanf("%s",s), we must write: scanf("%[^\n]s",s) which instructs the compiler to store
the string s while the new line (\n) is encountered. Let's consider the following example to store the
space-separated strings.
1. #include<stdio.h>
2. void main ()
3. {
4. char s[20];
5. printf("Enter the string?");
6. scanf("%[^\n]s",s);
7. printf("You entered %s",s);
8. }
368 | P a g e
Output
Here we must also notice that we do not need to use address of (&) operator in scanf to store a string
since string s is an array of characters and the name of the array, i.e., s indicates the base address of
the string (character array) therefore we need not use & with it.
o The compiler doesn't perform bounds checking on the character array. Hence, there can be a case
where the length of the string can exceed the dimension of the character array which may always
overwrite some important data.
o Instead of using scanf, we may use gets() which is an inbuilt function defined in a header file string.h.
The gets() is capable of receiving only one string at a time.
1. #include<stdio.h>
2. void main ()
3. {
4. char s[11] = "javatpoint";
5. char *p = s; // pointer p is pointing to string s.
6. printf("%s",p); // the string javatpoint is printed if we print p.
7. }
Output
javatpoint
369 | P a g e
As we know that string is an array of characters, the pointers can be used in the same way they were
used with arrays. In the above example, p is declared as a pointer to the array of characters s. P affects
similar to s since s is the base address of the string and treated as a pointer internally. However, we
can not change the content of s or copy the content of s into another string directly. For this purpose,
we need to use the pointers to store the strings. In the following example, we have shown the use of
pointers to copy the content of a string into another.
1. #include<stdio.h>
2. void main ()
3. {
4. char *p = "hello javatpoint";
5. printf("String p: %s\n",p);
6. char *q;
7. printf("copying the content of p into q...\n");
8. q = p;
9. printf("String q: %s\n",q);
10. }
Output
370 | P a g e
Once a string is defined, it cannot be reassigned to another set of characters. However, using pointers,
we can assign the set of characters to the string. Consider the following example.
1. #include<stdio.h>
2. void main ()
3. {
4. char *p = "hello javatpoint";
5. printf("Before assigning: %s\n",p);
6. p = "hello";
7. printf("After assigning: %s\n",p);
8. }
Output
C gets() function
The gets() function enables the user to enter some characters followed by the enter key. All the
characters entered by the user get stored in a character array. The null character is added to the array
to make it a string. The gets() allows the user to enter the space-separated strings. It returns the string
entered by the user.
Declaration
1. char[] gets(char[]);
Reading string using gets()
1. #include<stdio.h>
2. void main ()
3. {
4. char s[30];
5. printf("Enter the string? ");
6. gets(s);
7. printf("You entered %s",s);
8. }
371 | P a g e
Output
Enter the string?
javatpoint is the best
You entered javatpoint is the best
The gets() function is risky to use since it doesn't perform any array bound checking and keep reading
the characters until the new line (enter) is encountered. It suffers from buffer overflow, which can be
avoided by using fgets(). The fgets() makes sure that not more than the maximum limit of characters
are read. Consider the following example.
1. #include<stdio.h>
2. void main()
3. {
4. char str[20];
5. printf("Enter the string? ");
6. fgets(str, 20, stdin);
7. printf("%s", str);
8. }
Output
Enter the string? javatpoint is the best website
javatpoint is the b
C puts() function
The puts() function is very much similar to printf() function. The puts() function is used to print the
string on the console which is previously read by using gets() or scanf() function. The puts() function
returns an integer value representing the number of characters being printed on the console. Since, it
prints an additional newline character with the string, which moves the cursor to the new line on the
console, the integer value returned by puts() will always be equal to the number of characters present
in the string plus 1.
Declaration
1. int puts(char[])
Let's see an example to read a string using gets() and print it on the console using puts().
1. #include<stdio.h>
2. #include <string.h>
3. int main(){
4. char name[50];
5. printf("Enter your name: ");
372 | P a g e
6. gets(name); //reads string from user
7. printf("Your name is: ");
8. puts(name); //displays string
9. return 0;
10. }
Output:
Enter your name: Sonoo Jaiswal
Your name is: Sonoo Jaiswal
C String Functions
There are many important string functions defined in "string.h" library.
3) strcat(first_string, concats or joins first string with second string. The result of the string is
second_string) stored in first string.
4) strcmp(first_string, compares the first string with second string. If both strings are same, it
second_string) returns 0.
1. #include<stdio.h>
2. #include <string.h>
3. int main(){
373 | P a g e
4. char ch[20]={'j', 'a', 'v', 'a', 't', 'p', 'o', 'i', 'n', 't', '\0'};
5. printf("Length of string is: %d",strlen(ch));
6. return 0;
7. }
Output:
1. #include<stdio.h>
2. #include <string.h>
3. int main(){
4. char ch[20]={'j', 'a', 'v', 'a', 't', 'p', 'o', 'i', 'n', 't', '\0'};
5. char ch2[20];
6. strcpy(ch2,ch);
7. printf("Value of second string is: %s",ch2);
8. return 0;
9. }
Output:
Strcat() function in C
Programmers may easily concatenate two strings using the strcat() function in C, which is a potent
tool for manipulating strings. This function accepts two input strings and appends the second
string's content to the end of the first string. A single, longer string made up of the characters from
both input strings is the outcome. You must include the string.h header file to use strcat(). But to
prevent buffer overflow and unpredictable behavior, it is essential to make sure the first string has
enough memory to hold the concatenated content. In this article, we'll study several crucial string
concatenation principles in C and go in-depth on the strcat() method.
374 | P a g e
Concatenating strings is a fundamental programming process, particularly when working with text-
based data. Strings in C are character arrays that are ended by the null character "0". You may
produce longer and more insightful text outputs by adding one string to another with the strcat()
method.
The strcat(first_string, second_string) function concatenates two strings and result is returned to
first_string.
first_string: The concatenated result will be saved in this string, which is a reference to the target
string. The second_string's content is added to the end of the first_string by the function. Making
ensuring that the first_string has adequate memory to store the concatenated information is crucial.
Second_string: It is a reference to the source string that will be added to the end of the first_string.
During concatenation, the initial second_string is not modified.
1. #include<stdio.h>
2. #include <string.h>
3. int main(){
4. char ch[10]={'h', 'e', 'l', 'l', 'o', '\0'};
5. char ch2[10]={'c', '\0'};
6. strcat(ch,ch2);
7. printf("Value of first string is: %s",ch);
8. return 0;
9. }
Output
Explanation:
The required header files are included in the source code, stdio.h for standard input/output
routines and string.h for string manipulation operations like strcat().
There are two declared character arrays (ch and ch2). The first array, ch, begins with the
letters "hello" and ends with the specifically specified null character "0". The letter "c" is found in the
second array, ch2, followed by the null character "0".
The two strings are concatenated using the strcat(ch, ch2) function. The characters from ch2 will be
added to the end of ch in accordance with the behavior of the function. The adjusted ch array will
appear as follows concatenation: "helloc0" (remember that "0" stands for the null terminator).
375 | P a g e
The changed ch array is then displayed using the printf() function, producing the following
output: "Value of the first string is: helloc".
Conclusion:
In conclusion, developers may effectively deal with character arrays due to the C programming
language's robust string manipulation capabilities like strcat(). The strcat() method is designed to
join two strings together by merging the end of the second string with the contents of the first. Care
must be taken while utilizing this function to prevent buffer overflow and undefinable behavior.
The strcat() function successfully combined the strings "hello" and "c" in the supplied code sample,
producing the output "helloc". It emphasizes how crucial it is to check that the destination string has
enough room to hold the combined result.
When working with unknown or dynamic data, developers should always evaluate the sizes of the
source and destination arrays before using strcat() and may want to use strncat() with a set
maximum length.
There are several string manipulation functions available in the C language, each with special benefits
and applications. The creation of reliable and secure software will be facilitated by understanding
these functions and using safe coding techniques. Understanding string handling, a fundamental
programming component, enables programmers to build more complex and dependable systems
across various industries. As their exploration of C programming progresses, aspiring programmers
should get more familiar with the language's features and gain proficiency in it.
Strcmp() function in C
The C standard library includes the strcmp() function for string comparison. In C programming, it
is frequently used to compare two strings and is a component of the <string.h> header. A
connection between the two strings is shown by the function's return value, which is an integer
value.
The strcmp(first_string, second_string) function compares two strings and returns 0 if both strings are
equal.
If str1 is lexicographically smaller to str2, it returns an integer value that is less than 0.
376 | P a g e
It returns 0 if str1 and str2 are equal.
Here, we are using gets()function, which reads string from the console.
1. #include<stdio.h>
2. #include <string.h>
3. int main(){
4. char str1[20],str2[20];
5. printf("Enter 1st string: ");
6. gets(str1);//reads string from console
7. printf("Enter 2nd string: ");
8. gets(str2);
9. if(strcmp(str1,str2)==0)
10. printf("Strings are equal");
11. else
12. printf("Strings are not equal");
13. return 0;
14. }
Output
Explanation:
The program comes with the appropriate header files, including "stdio.h" for functions that deal
with standard input/output and "string.h" for functions that deal with strings, including strcmp().
Two-character arrays str1 and str2 of size 20 are declared to hold the input strings supplied by the
user.
Using the printf() method, the program asks the user to input the first string.
The input string is read from the console using the gets() method. However, it is significant to
highlight that due to its susceptibility to buffer overflow attacks, gets() is deprecated and not advised.
In a similar manner, the program asks the user to enter the second string before using gets() to read
it.
After that, the two strings str1 and str2 are put to a comparison using the strcmp() method.
377 | P a g e
Since the two strings are equal if strcmp() returns 0, the program writes "Strings are
equal" using printf().
Otherwise, the program outputs "Strings are not equal" if strcmp() returns a non-zero result.
Lastly, the main function returns 0, indicating that the program has successfully run.
Two strings are character-by-character compared using the strcmp() method. The comparison
process begins with each string's first characters. If they are equal, it advances to the subsequent
characters until either:
It decides which string is lexicographically bigger or smaller based on the differences between the
matching characters, or it reaches the end of one or both strings.
Uppercase and lowercase letters are viewed differently in the comparison since it takes the case into
account.
The function presupposes that the strings handed in as input are null-terminated. A string that ends
with the null character ('0') is known as a null-terminated string.
In this example, the gets() function is used to read strings from the console. It is important to note
that the gets() method has been deprecated in the C programming language and is strongly
discouraged. The main cause of the issue is that gets() has no method to control how many
characters are read from the input, rendering it vulnerable to buffer overflow attacks that can result
in security flaws.
It is advised to use fgets() in place of the console to safely read strings. To avoid buffer overflows,
the fgets() function lets you set the maximum number of characters to read.
The strrev(string) function returns reverse of the given string. Let's see a simple example of strrev()
function.
1. #include<stdio.h>
2. #include <string.h>
378 | P a g e
3. int main(){
4. char str[20];
5. printf("Enter string: ");
6. gets(str);//reads string from console
7. printf("String is: %s",str);
8. printf("\nReverse String is: %s",strrev(str));
9. return 0;
10. }
Output
Explanation:
The provided C code accepts a string as input, uses the strrev() function to reverse it, and outputs
both the original and reversed texts. Using the strrev() method, the text "javatpoint" is reversed to
become "tnioptavaj".
o Security Risks: It is inherently dangerous because the strrev() method changes the original string in
place. If the target buffer is not big enough to accommodate the reversed string, it might result
in buffer overflows. Attackers may use buffer overflows to run malicious code, potentially resulting in
security flaws.
o Lack of Standard Library Support: Since strrev() is not supported by the C standard library, its
behavior may change between systems and compilers. As a result, code that uses strrev() might not run
on different platforms.
o Strrev Is Not a Safe Replacement for strdup(): Some programmers could try to use strrev() in place
of the string duplication method strdup(). Strrev() alters the old string; it does not produce a
new reversed string. Therefore, it is not a reliable alternative to strdup().
o Strrev() is not a standard function, as was previously indicated, and current C programming
conventions encourage the use of safer and more dependable alternatives.
379 | P a g e
If you want to reverse a string in C instead of using strrev(), you should think about the
following alternatives:
Using a Loop: Until you reach the center of the string, you can traverse it using a loop, switching
characters from the beginning with characters from the end.
Using a Temporary Array: If you want to produce a reversed string, copy the characters from
the original string into a temporary array in the opposite sequence and then null-terminate the
array.
Using Standard Library methods: If you are familiar with C++, you can quickly reverse a string by
using the standard library's std::string and std::reverse methods.
The strrev() function in C is not a recommended method for string manipulation due to several
significant restrictions and possible hazards, despite its popularity among developers for reversing
strings. It is not portable because it is not a part of the C standard library and because of its unsafe
behavior, which might result in buffer overflows and expose security flaws in the code.
Using strrev() is discouraged in modern C programming practices, which emphasize safe and
dependable string manipulation approaches. Developers are urged to choose other approaches, such
as traversing and swapping characters in the string using loops or temporarily storing the reversed
text in an array.
Developers may ensure their code is resistant to vulnerabilities and can be reliably executed across
many platforms and compilers by using more secure ways.
The standard library's string manipulation methods, such as std::string and std::reverse, which
provide a safer and more user-friendly way to reverse strings, are also available to developers using
C++.
In conclusion, avoiding the use of strrev() and implementing safer ways for string reversing conforms
with contemporary best practices for programming and contributes to the development of C code
that is more dependable, secure, and manageable.
Strlwr() function in C
Working with strings is a regular activity while programming in the C programming language. It is
frequently necessary to transform strings to lowercase or uppercase to ensure uniform
processing and comparisons. The strlwr() function is very crucial in this situation. It is a string
manipulation function that can be found in the C Standard Library (string.h) and is used to change the case
of characters in a string. In-depth explanations of the strlwr() function and a practical application example
are provided in this article.
380 | P a g e
Every capital letter in a C-style string is changed to its corresponding lowercase character using the strlwr()
function. One input, a reference to the string that must be transformed, is all that is required. The function
makes the necessary modifications to the initial string while still returning the same pointer. It's crucial to
remember that this method isn't standardized and cannot be accessible on all C implementations.
Syntax:
It has the following syntax:
str: It is a reference to the string that must be lowercase and has a null ending.
Value Returned:
The same pointer str is returned by the strlwr() method, which now points to the altered lowercase text.
The strlwr(string) function returns string characters in lowercase. Let's see a simple example of strlwr()
function.
1. #include<stdio.h>
2. #include <string.h>
3. int main(){
4. char str[20];
5. printf("Enter string: ");
6. gets(str);//reads string from console
7. printf("String is: %s",str);
8. printf("\nLower String is: %s",strlwr(str));
9. return 0;
10. }
Output
Explanation:
The relevant header files are first included in the code: stdio.h for input/output operations
and string.h for functions involving string manipulation.
381 | P a g e
The printf() method asks the user to provide a string.
The gets() method reads the input string. It's crucial to remember that the gets() method is insecure and
should be swapped out with fgets() to prevent buffer overflow. The printf() function prints the
original input string.
After that, the str pointer is sent as an argument when using the strlwr() method. The method returns
the changed text after changing all capital letters in the string to lowercase.
After that, the printf() function is used to output the lowercase string.
1. #include <stdio.h>
2. #include <string.h>
3.
4. int main() {
5. char str[20];
6.
7. printf("Enter string: ");
8. fgets(str, sizeof(str), stdin);
9.
10. // Rest of the code remains unchanged.
11. }
Output
Conclusion:
In conclusion, the C language's strlwr() function offers an easy way to change uppercase to lowercase
letters within a string, enabling case-insensitive operations and reliable string processing. Despite being
frequently used, the function is non-standard and may not be included in all C implementations, which raises
questions regarding portability.
382 | P a g e
The example code was advised against using gets(), and the safer substitute fgets() was suggested instead to
solve potential security flaws. It is essential to ensure safe input handling to avoid buffer overflow and memory
corruption problems.
Although strlwr() can effectively accomplish its goal, programmers should be aware of its limits and consider
other standard-compliant approaches to string manipulation. It may be more portable to use bespoke functions
in various C environments when converting lowercase strings.
Overall, being proficient with string manipulation in C, especially the proper application of methods
like strlwr(), equips programmers to deal with strings quickly and write reliable, safe, and portable programs.
The strupr(string) function returns string characters in uppercase. Let's see a simple example of
strupr() function.
Output
Explanation:
The program begins by incorporating the required header files: string.h for functions related
to strings and stdio.h for input/output operations. It defines a 20-character str array as its size. The
user-provided input string will be kept in this array.
A prompt message asking the user to enter a string is shown using the printf() function.
The user-input string is received from the console and stored in the str array using the gets()
method. It is crucial to remember that using gets() function might result in buffer overflow
problems, making it dangerous. It is preferable to utilize fgets() to reliably read input in real-world
applications.
383 | P a g e
After that, the original input string is shown by the program using printf() function. The intriguing
portion is about to start. The str array is sent as an argument when the strupr() method is used.
All alphabetic characters in the string will be converted to uppercase using this function, which
makes the changes in-place.
After that, the updated (uppercase) string is printed by the program using the printf() function.
Cautions:
1. As previously explained, the gets () method is unsafe to employ since it doesn't verify the size of the
buffer and can result in buffer overflows. Use fgets() to safely read input instead.
2. Locale Consideration: Since different locales may have rules for case conversions, the behavior
of strupr() may vary depending on the current locale settings. It's crucial to confirm that your locale
settings are acceptable for your use case if you see unexpected behavior.
3. It's important to note that the strupr() function is not a part of the C standard library. It may not be
present in all C contexts, despite being often accessible on many C compilers (such as Borland C,
Turbo C, etc.).
Conclusion:
In conclusion, the C strupr() function provides a practical and simple method for changing all the
characters in each string to uppercase. Although it is not a part of the standard C library, it is
frequently present in many C settings and can be handy for case-insensitive string manipulation.
Nevertheless, the feature must be used with caution.
The unsafe gets() function, which can result in buffer overflows, is one of the main issues with the
presented code example. It is advised to utilize methods like fgets() to read input with a designated
buffer size to ensure secure input handling.
Additionally, strupr()'s behavior could be impacted by the current locale settings, which may have an
impact on the conversion process based on certain language regulations. For better control over case
384 | P a g e
conversion, it's recommended to select the proper locale or make use of common character
manipulation methods like toupper() function.
Strstr() function in C
The strstr() function in C is a part of the string.h library and is used to find the first occurrence of a
substring within a given string. If the substring is found in the string, it returns a pointer to the first
character of the first occurrence of the substring. The function returns a NULL pointer if the substring
is not present in the given string.
Syntax:
It has the following syntax:
Function Name:
The strstr() function stands for "string search". It is a built-in C library function that searches for a
substring within a larger string.
Return Type:
The function returns a pointer to the substring ('match')'s first occurrence within the text ('string'). If
the substring cannot be found, the method returns NULL.
Parameters:
o 'string' (const char *): It is the input string in which the substring should be found.
o 'match' (const char *): It is the substring you want to search for within the string.
Function Behavior:
The strstr() function looks for the first instance of the substring ('match') inside the more extensive
string ('string').
It returns a reference to the haystack place where the substring begins or NULL if it cannot be
found.
385 | P a g e
Case Sensitivity:
By default, strstr() is case-sensitive. It differentiates between uppercase and lowercase characters in
both the string and the match.
Example Usage:
1. #include <stdio.h>
2. #include <string.h>
3.
4. intmain() {
5. char str[100] = "this is javatpoint with c and java";
6. char *sub;
7.
8. sub = strstr(str, "java");
9.
10. if (sub != NULL) {
11. printf("Substring is: %s", sub);
12. } else {
13. printf("Substring not found.");
14. }
15.
16. return 0;
17. }
Output:
Complexity:
Explanation:
In the example above, the strstr() function searches for the first occurrence of the substring "java" in
the string str. Since "java" is present in the string, the function returns a pointer to the beginning of
the matched substring "javatpoint with c and java", which is then printed using the printf() function.
386 | P a g e
The strstr() function returns a pointer to the first occurrence of the matched string in the given string.
It returns the substring from the first match to the last character.
Application:
Searching for a specific word within a given text.
Example Code:
1. #include <stdio.h>
2. #include <string.h>
3.
4. int main() {
5. const char *text = "The quick brown fox leaps over the sleepy dog.";
6. const char *word = "fox";
7.
8. char *result = strstr(text, word);
9.
10. if (result != NULL) {
11. printf("Word '%s' found at index: %ld\n", word, result - text);
12. } else {
13. printf("Word '%s' not found.\n", word);
14. }
15.
16. return 0;
17. }
Output:
Complexity:
The primary purpose of the strstr() function is to search for the first occurrence of a substring within
a larger string (match).
o Pointer Return:
It gives back a pointer to the substring's leading character that was located in the haystack. A NULL
reference is returned if the substring is not found.
o Case Sensitivity:
By default, the strstr() function performs a case-sensitive search. It considers the exact sequence of
characters in the needle and haystack.
o Customizable Search:
While the strstr() function is case-sensitive by default, you can implement case-insensitive searching
by converting the haystack and the needle to lowercase or uppercase before performing the search.
o String Manipulation:
The returned pointer can be used to manipulate the string, such as extracting the substring,
modifying it, or performing other operations.
o Text Processing:
The strstr() function is commonly used in text processing tasks, such as finding keywords or phrases
within text, highlighting search terms, and performing basic string-based operations.
o Efficiency:
Although the worst-case time complexity of the strstr() function is not always optimal (O((n - m + 1)
* m)), where n is the length of the haystack & m is the length of the needle, it still performs well for
many practical use cases.
o Library Function:
The strstr() function can be found in the string.h header of the C Standard Library. It indicates that it
can be used without extra libraries or dependencies in any C environment.
The strstr() function works with null-terminated strings, like most C string methods. It indicates that
it expects strings ending with a null character ('0').
388 | P a g e
o Character Set Agnostic:
The strstr() function operates on individual bytes and does not depend on the
character encoding used for the strings. It's suitable for various character sets, including ASCII and
Unicode.
The strstr() fucntion can be supplemented with additional string functions like altering substrings,
counting occurrences, and separating strings.
o Portability
As the strstr() function is a component of the C Standard Library, it is accessible on many platforms
and compilers, enhancing the portability of your work.
Although strstr() is flexible and effective for many applications, there may be occasions where other
string manipulation methods or libraries are more appropriate. This is especially true if you need to
perform more in-depth text processing or pattern matching.
Advantages:
o Simplicity: The strstr() function is straightforward, especially for basic substring search operations. Its
interface is simple and doesn't require complex configurations.
o Built-in Functionality: It is part of the C Standard Library and is available in virtually every C
environment without requiring additional libraries or dependencies.
o Portability: Since it is a standard library function, code using the strstr() function tends to be more
portable across different systems and compilers.
o Efficiency for Many Use Cases: While its worst-case time complexity isn't optimal (O((n - m + 1) *
m)), it performs well for many practical scenarios, making it suitable for basic text processing tasks.
o Text Processing: It is especially useful for searching for keywords, extracting substrings, and
basic string manipulations.
o Pointer Manipulation: The returned pointer can be used to directly manipulate the string or perform
further operations without needing extra memory allocation.
389 | P a g e
Disadvantages:
o Limited to First Occurrence: The strstr() function only finds the first occurrence of the substring
within the haystack. If you need to find all occurrences, you'll need to implement additional logic.
o Inefficiency in Some Cases: The worst-case time complexity of the strstr() function can be inefficient
for large strings or when searching for long substrings within long haystacks.
o Case Sensitivity: By default, the strstr() function is case-sensitive. If you require case-insensitive
searching, you must convert strings to lowercase or uppercase, which might be time-consuming.
o Advanced Features Missing: While the strstr() function is adequate for basic jobs, it lacks complex
features such as regular expressions and more complicated pattern matching.
o Not Suitable for Binary Data: It's designed for null-terminated strings, so it might not work well for
searching within binary data containing null bytes.
o Memory Manipulation: While the returned pointer can be used to manipulate the string, improper
usage could lead to buffer overflows or memory corruption.
o Limited Error Reporting: If the substring is not found in the string, the strstr() function primarily
returns a pointer to the substring or NULL. It doesn't provide detailed error messages, making
debugging more challenging.
Conclusion:
The strstr() function is useful for searching and extracting substrings within C strings. It is widely
used in various applications that involve string processing and manipulation. However, it's essential to
be mindful of case sensitivity, edge cases, and the potential performance impact when dealing with
large strings.
390 | P a g e
C Math
C Programming allows us to perform mathematical operations through the functions defined in
<math.h> header file. The <math.h> header file contains various methods for performing
mathematical operations such as sqrt(), pow(), ceil(), floor() etc.
C Math Functions
There are various methods in math.h header file. The commonly used functions of math.h header file
are given below.
1) ceil(number) rounds up the given number. It returns the integer value which is greater than or
equal to given number.
2) floor(number) rounds down the given number. It returns the integer value which is less than or
equal to given number.
391 | P a g e
C Math Example
Let's see a simple example of math functions found in math.h header file.
1. #include<stdio.h>
2. #include <math.h>
3. int main(){
4. printf("\n%f",ceil(3.6));
5. printf("\n%f",ceil(3.3));
6. printf("\n%f",floor(3.6));
7. printf("\n%f",floor(3.2));
8. printf("\n%f",sqrt(16));
9. printf("\n%f",sqrt(7));
10. printf("\n%f",pow(2,4));
11. printf("\n%f",pow(3,3));
12. printf("\n%d",abs(-12));
13. return 0;
14. }
Output:
4.000000
4.000000
3.000000
3.000000
4.000000
2.645751
16.000000
27.000000
12
392 | P a g e
C Structure Union
C structure
Why use structure?
In C, there are cases where we need to store multiple attributes of an entity. It is not necessary that an
entity has all the information of one type only. It can have different attributes of different data types.
For example, an entity Student may have its name (string), roll number (int), marks (float). To store
such type of information regarding an entity student, we have the following approaches:
o Construct individual arrays for storing names, roll numbers, and marks.
o Use a special data structure to store the collection of different data types.
1. #include<stdio.h>
2. void main ()
3. {
4. char names[2][10],dummy; // 2-dimensioanal character array names is used to store the names of the student
s
5. int roll_numbers[2],i;
6. float marks[2];
7. for (i=0;i<3;i++)
8. {
9.
10. printf("Enter the name, roll number, and marks of the student %d",i+1);
11. scanf("%s %d %f",&names[i],&roll_numbers[i],&marks[i]);
12. scanf("%c",&dummy); // enter will be stored into dummy character at each iteration
13. }
14. printf("Printing the Student details ...\n");
15. for (i=0;i<3;i++)
16. {
17. printf("%s %d %f\n",names[i],roll_numbers[i],marks[i]);
18. }
19. }
393 | P a g e
Output
Enter the name, roll number, and marks of the student 1Arun 90 91
Enter the name, roll number, and marks of the student 2Varun 91 56
Enter the name, roll number, and marks of the student 3Sham 89 69
The above program may fulfill our requirement of storing the information of an entity student.
However, the program is very complex, and the complexity increase with the amount of the input. The
elements of each of the array are stored contiguously, but all the arrays may not be stored
contiguously in the memory. C provides you with an additional and simpler approach where you can
use a special data structure, i.e., structure, in which, you can group all the information of different data
type regarding an entity.
What is Structure
Structure in c is a user-defined data type that enables us to store the collection of different data types.
Each element of a structure is called a member. Structures ca; simulate the use of classes and
templates as it can store various information
The ,struct keyword is used to define the structure. Let's see the syntax to define the structure in c.
1. struct structure_name
2. {
3. data_type member1;
4. data_type member2;
5. .
6. .
7. data_type memeberN;
8. };
1. struct employee
2. { int id;
3. char name[20];
4. float salary;
5. };
394 | P a g e
The following image shows the memory allocation of the structure employee that is defined in the
above example.
Here, struct is the keyword; employee is the name of the structure; id, name, and salary are the
members or fields of the structure. Let's understand it by the diagram given below:
395 | P a g e
1st way:
Let's see the example to declare the structure variable by struct keyword. It should be declared within
the main function.
1. struct employee
2. { int id;
3. char name[50];
4. float salary;
5. };
The variables e1 and e2 can be used to access the values stored in the structure. Here, e1 and e2 can
be treated in the same way as the objects in C++ and Java.
2nd way:
Let's see another way to declare variable at the time of defining the structure.
1. struct employee
2. { int id;
3. char name[50];
4. float salary;
5. }e1,e2;
Which approach is good
If number of variables are not fixed, use the 1st approach. It provides you the flexibility to declare the
structure variable many times.
If no. of variables are fixed, use 2nd approach. It saves your code to declare a variable in main()
function.
396 | P a g e
Let's see the code to access the id member of p1 variable by. (member) operator.
1. p1.id
C Structure example
Let's see a simple example of structure in C language.
1. #include<stdio.h>
2. #include <string.h>
3. struct employee
4. { int id;
5. char name[50];
6. }e1; //declaring e1 variable for structure
7. int main( )
8. {
9. //store first employee information
10. e1.id=101;
11. strcpy(e1.name, "Sonoo Jaiswal");//copying string into char array
12. //printing first employee information
13. printf( "employee 1 id : %d\n", e1.id);
14. printf( "employee 1 name : %s\n", e1.name);
15. return 0;
16. }
Output:
employee 1 id : 101
employee 1 name : Sonoo Jaiswal
Let's see another example of the structure in C language to store many employees information.
1. #include<stdio.h>
2. #include <string.h>
3. struct employee
4. { int id;
5. char name[50];
6. float salary;
7. }e1,e2; //declaring e1 and e2 variables for structure
8. int main( )
397 | P a g e
9. {
10. //store first employee information
11. e1.id=101;
12. strcpy(e1.name, "Sonoo Jaiswal");//copying string into char array
13. e1.salary=56000;
14.
15. //store second employee information
16. e2.id=102;
17. strcpy(e2.name, "James Bond");
18. e2.salary=126000;
19.
20. //printing first employee information
21. printf( "employee 1 id : %d\n", e1.id);
22. printf( "employee 1 name : %s\n", e1.name);
23. printf( "employee 1 salary : %f\n", e1.salary);
24.
25. //printing second employee information
26. printf( "employee 2 id : %d\n", e2.id);
27. printf( "employee 2 name : %s\n", e2.name);
28. printf( "employee 2 salary : %f\n", e2.salary);
29. return 0;
30. }
Output:
employee 1 id : 101
employee 1 name : Sonoo Jaiswal
employee 1 salary : 56000.000000
employee 2 id : 102
employee 2 name : James Bond
employee 2 salary : 126000.000000
typedef in C
The typedef is a keyword used in C programming to provide some meaningful names to the already
existing variable in the C program. It behaves similarly as we define the alias for the commands. In
short, we can say that this keyword is used to redefine the name of an already existing variable.
Syntax of typedef
1. typedef <existing_name> <alias_name>
398 | P a g e
In the above syntax, 'existing_name' is the name of an already existing variable while 'alias name' is
another name given to the existing variable.
For example, suppose we want to create a variable of type unsigned int, then it becomes a tedious
task if we want to declare multiple variables of this type. To overcome the problem, we use a
typedef keyword.
In the above statements, we have declared the unit variable of type unsigned int by using a
typedef keyword.
Now, we can create the variables of type unsigned int by writing the following statement:
1. unit a, b;
instead of writing:
1. unsigned int a, b;
Till now, we have observed that the typedef keyword provides a nice shortcut by providing an
alternative name for an already existing variable. This keyword is useful when we are dealing with the
long data type especially, structure declarations.
1. #include <stdio.h>
2. int main()
3. {
4. typedef unsigned int unit;
5. unit i,j;
6. i=10;
7. j=20;
8. printf("Value of i is :%d",i);
9. printf("\nValue of j is :%d",j);
10. return 0;
11. }
Output
Value of i is :10
Value of j is :20
399 | P a g e
Using typedef with structures
Consider the below structure declaration:
1. struct student
2. {
3. char name[20];
4. int age;
5. };
6. struct student s1;
In the above structure declaration, we have created the variable of student type by writing the
following statement:
The above statement shows the creation of a variable, i.e., s1, but the statement is quite big. To avoid
such a big statement, we use the typedef keyword to create the variable of type student.
1. struct student
2. {
3. char name[20];
4. int age;
5. };
6. typedef struct student stud;
7. stud s1, s2;
In the above statement, we have declared the variable stud of type struct student. Now, we can use
the stud variable in a program to create the variables of type struct student.
400 | P a g e
From the above declarations, we conclude that typedef keyword reduces the length of the code and
complexity of data types. It also helps in understanding the program.
1. #include <stdio.h>
2. typedef struct student
3. {
4. char name[20];
5. int age;
6. }stud;
7. int main()
8. {
9. stud s1;
10. printf("Enter the details of student s1: ");
11. printf("\nEnter the name of the student:");
12. scanf("%s",&s1.name);
13. printf("\nEnter the age of student:");
14. scanf("%d",&s1.age);
15. printf("\n Name of the student is : %s", s1.name);
16. printf("\n Age of the student is : %d", s1.age);
17. return 0;
18. }
Output
ADVERTISEMENT
1. int* ptr;
401 | P a g e
We can rename the above pointer variable as given below:
In the above statement, we have declared the variable of type int*. Now, we can create the variable of
type int* by simply using the 'ptr' variable as shown in the below statement:
1. ptr p1, p2 ;
C Array of Structures
Why use an array of structures?
Consider a case, where we need to store the data of 5 students. We can store it by using the structure
as given below.
1. #include<stdio.h>
2. struct student
3. {
4. char name[20];
5. int id;
6. float marks;
7. };
8. void main()
9. {
10. struct student s1,s2,s3;
11. int dummy;
12. printf("Enter the name, id, and marks of student 1 ");
13. scanf("%s %d %f",s1.name,&s1.id,&s1.marks);
14. scanf("%c",&dummy);
15. printf("Enter the name, id, and marks of student 2 ");
16. scanf("%s %d %f",s2.name,&s2.id,&s2.marks);
17. scanf("%c",&dummy);
18. printf("Enter the name, id, and marks of student 3 ");
19. scanf("%s %d %f",s3.name,&s3.id,&s3.marks);
20. scanf("%c",&dummy);
402 | P a g e
21. printf("Printing the details....\n");
22. printf("%s %d %f\n",s1.name,s1.id,s1.marks);
23. printf("%s %d %f\n",s2.name,s2.id,s2.marks);
24. printf("%s %d %f\n",s3.name,s3.id,s3.marks);
25. }
Output
In the above program, we have stored data of 3 students in the structure. However, the complexity of
the program will be increased if there are 20 students. In that case, we will have to declare 20 different
structure variables and store them one by one. This will always be tough since we will have to declare
a variable every time we add a student. Remembering the name of all the variables is also a very tricky
task. However, c enables us to declare an array of structures by using which, we can avoid declaring
the different structure variables; instead we can make a collection containing all the structures that
store the information of different entities.
Array of Structures in C
An array of structres in C can be defined as the collection of multiple structures variables where each
variable contains information about different entities. The array of structures in C are used to store
information about multiple entities of different data types. The array of structures is also known as the
collection of structures.
403 | P a g e
Let's see an example of an array of structures that stores information of 5 students and prints it.
1. #include<stdio.h>
2. #include <string.h>
3. struct student{
4. int rollno;
5. char name[10];
6. };
7. int main(){
8. int i;
9. struct student st[5];
10. printf("Enter Records of 5 students");
11. for(i=0;i<5;i++){
12. printf("\nEnter Rollno:");
404 | P a g e
13. scanf("%d",&st[i].rollno);
14. printf("\nEnter Name:");
15. scanf("%s",&st[i].name);
16. }
17. printf("\nStudent Information List:");
18. for(i=0;i<5;i++){
19. printf("\nRollno:%d, Name:%s",st[i].rollno,st[i].name);
20. }
21. return 0;
22. }
Output:
Nested Structure in C
C provides us the feature of nesting one structure within another structure by using which, complex
data types are created. For example, we may need to store the address of an entity employee in a
structure. The attribute address may also have the subparts as street number, city, state, and pin code.
Hence, to store the address of the employee, we need to store the address of the employee into a
separate structure and nest the structure address into the structure employee. Consider the following
program.
1. #include<stdio.h>
2. struct address
3. {
4. char city[20];
5. int pin;
405 | P a g e
6. char phone[14];
7. };
8. struct employee
9. {
10. char name[20];
11. struct address add;
12. };
13. void main ()
14. {
15. struct employee emp;
16. printf("Enter employee information?\n");
17. scanf("%s %s %d %s",emp.name,emp.add.city, &emp.add.pin, emp.add.phone);
18. printf("Printing the employee information....\n");
19. printf("name: %s\nCity: %s\nPincode: %d\nPhone: %s",emp.name,emp.add.city,emp.add.pin,emp.add.phone);
20. }
Output
Arun
Delhi
110001
1234567890
name: Arun
City: Delhi
Pincode: 110001
Phone: 1234567890
1. By separate structure
2. By Embedded structure
406 | P a g e
1) Separate structure
Here, we create two structures, but the dependent structure should be used inside the main structure
as a member. Consider the following example.
1. struct Date
2. {
3. int dd;
4. int mm;
5. int yyyy;
6. };
7. struct Employee
8. {
9. int id;
10. char name[20];
11. struct Date doj;
12. }emp1;
As you can see, doj (date of joining) is the variable of type Date. Here doj is used as a member in
Employee structure. In this way, we can use Date structure in many structures.
2) Embedded structure
The embedded structure enables us to declare the structure inside the structure. Hence, it requires
less line of codes but it can not be used in multiple data structures. Consider the following example.
1. struct Employee
2. {
3. int id;
4. char name[20];
5. struct Date
6. {
7. int dd;
8. int mm;
9. int yyyy;
10. }doj;
11. }emp1;
407 | P a g e
Accessing Nested Structure
We can access the member of the nested structure by Outer_Structure.Nested_Structure.member as
given below:
1. e1.doj.dd
2. e1.doj.mm
3. e1.doj.yyyy
1. #include <stdio.h>
2. #include <string.h>
3. struct Employee
4. {
5. int id;
6. char name[20];
7. struct Date
8. {
9. int dd;
10. int mm;
11. int yyyy;
12. }doj;
13. }e1;
14. int main( )
15. {
16. //storing employee information
17. e1.id=101;
18. strcpy(e1.name, "Sonoo Jaiswal");//copying string into char array
19. e1.doj.dd=10;
20. e1.doj.mm=11;
21. e1.doj.yyyy=2014;
22.
23. //printing first employee information
24. printf( "employee id : %d\n", e1.id);
25. printf( "employee name : %s\n", e1.name);
408 | P a g e
26. printf( "employee date of joining (dd/mm/yyyy) : %d/%d/%d\n", e1.doj.dd,e1.doj.mm,e1.doj.yyyy);
27. return 0;
28. }
Output:
employee id : 101
employee name : Sonoo Jaiswal
employee date of joining (dd/mm/yyyy) : 10/11/2014
1. #include<stdio.h>
2. struct address
3. {
4. char city[20];
5. int pin;
6. char phone[14];
7. };
8. struct employee
9. {
10. char name[20];
11. struct address add;
12. };
13. void display(struct employee);
14. void main ()
15. {
16. struct employee emp;
17. printf("Enter employee information?\n");
18. scanf("%s %s %d %s",emp.name,emp.add.city, &emp.add.pin, emp.add.phone);
19. display(emp);
20. }
21. void display(struct employee emp)
22. {
23. printf("Printing the details....\n");
409 | P a g e
24. printf("%s %s %d %s",emp.name,emp.add.city,emp.add.pin,emp.add.phone);
25. }
Structure Padding in C
Structure padding is a concept in C that adds the one or more empty bytes between the memory
addresses to align the data in memory.
Let's first understand the structure padding in C through a simple scenario which is given
below:
Suppose we create a user-defined structure. When we create an object of this structure, then the
contiguous memory will be allocated to the structure members.
1. struct student
2. {
3. char a;
4. char b;
5. int c;
6. } stud1;
In the above example, we have created a structure of type student. We have declared the object of
this structure named as 'stud1'. After the creation of an object, a contiguous block of memory is
allocated to its structure members. First, the memory will be allocated to the 'a' variable, then 'b'
variable, and then 'c' variable.
Now, we calculate the size of the struct student. We assume that the size of the int is 4 bytes, and the
size of the char is 1 byte.
1. struct student
2. {
3. char a; // 1 byte
4. char b; // 1 byte
5. int c; // 4 bytes
6. }
In the above case, when we calculate the size of the struct student, size comes to be 6 bytes. But this
answer is wrong. Now, we will understand why this answer is wrong? We need to understand the
concept of structure padding.
410 | P a g e
Structure Padding
The processor does not read 1 byte at a time. It reads 1 word at a time.
If we have a 32-bit processor, then the processor reads 4 bytes at a time, which means that 1 word is
equal to 4 bytes.
1. 1 word = 4 bytes
If we have a 64-bit processor, then the processor reads 8 bytes at a time, which means that 1 word is
equal to 8 bytes.
1. 1 word = 8 bytes
Therefore, we can say that a 32-bit processor is capable of accessing 4 bytes at a time, whereas a 64-
bit processor is capable of accessing 8 bytes at a time. It depends upon the architecture that what
would be the size of the word.
If we have a 32-bit processor (4 bytes at a time), then the pictorial representation of the memory for
the above structure would be:
411 | P a g e
As we know that structure occupies the contiguous block of memory as shown in the above diagram,
i.e., 1 byte for char a, 1 byte for char b, and 4 bytes for int c, then what problem do we face in this
case.
The 4-bytes can be accessed at a time as we are considering the 32-bit architecture. The problem is
that in one CPU cycle, one byte of char a, one byte of char b, and 2 bytes of int c can be accessed.
We will not face any problem while accessing the char a and char b as both the variables can be
accessed in one CPU cycle, but we will face the problem when we access the int c variable as 2 CPU
cycles are required to access the value of the 'c' variable. In the first CPU cycle, the first two bytes are
accessed, and in the second cycle, the other two bytes are accessed.
Suppose we do not want to access the 'a' and 'b' variable, we only want to access the variable 'c',
which requires two cycles. The variable 'c' is of 4 bytes, so it can be accessed in one cycle also, but in
this scenario, it is utilizing 2 cycles. This is an unnecessary wastage of CPU cycles. Due to this reason,
the structure padding concept was introduced to save the number of CPU cycles. The structure
padding is done automatically by the compiler. Now, we will see how structure padding is done.
In order to achieve the structure padding, an empty row is created on the left, as shown in the above
diagram, and the two bytes which are occupied by the 'c' variable on the left are shifted to the right.
So, all the four bytes of 'c' variable are on the right. Now, the 'c' variable can be accessed in a single
CPU cycle. After structure padding, the total memory occupied by the structure is 8 bytes (1 byte+1
byte+2 bytes+4 bytes), which is greater than the previous one. Although the memory is wasted in this
case, the variable can be accessed within a single cycle.
1. #include <stdio.h>
2. struct student
3. {
4. char a;
412 | P a g e
5. char b;
6. int c;
7. };
8. int main()
9. {
10. struct student stud1; // variable declaration of the student type..
11. // Displaying the size of the structure student.
12. printf("The size of the student structure is %d", sizeof(stud1));
13. return 0;
14. }
In the above code, we have created a structure named 'student'. Inside the main() method, we
declare a variable of student type, i.e., stud1, and then we calculate the size of the student by using
the sizeof() operator. The output would be 8 bytes due to the concept of structure padding, which
we have already discussed in the above.
Output
1. #include <stdio.h>
2. struct student
3. {
4. char a;
5. int b;
6. char c;
7. };
8. int main()
9. {
10. struct student stud1; // variable declaration of the student type..
11. // Displaying the size of the structure student.
413 | P a g e
12. printf("The size of the student structure is %d", sizeof(stud1));
13. return 0;
14. }
The above code is similar to the previous code; the only thing we change is the order of the variables
inside the structure student. Due to the change in the order, the output would be different in both
the cases. In the previous case, the output was 8 bytes, but in this case, the output is 12 bytes, as we
can observe in the below screenshot.
Output
o Now, the memory will be allocated to the int b Since the int variable occupies 4 bytes, but on the left,
only 3 bytes are available. The empty row will be created on these 3 bytes, and the int variable would
414 | P a g e
occupy the other 4 bytes so that the integer variable can be accessed in a single CPU cycle.
o Now, the memory will be given to the char c At a time, CPU can access 1 word, which is equal to 4
bytes, so CPU will use 4 bytes to access a 'c' variable. Therefore, the total memory required is 12 bytes
(4 bytes +4 bytes +4 bytes), i.e., 4 bytes required to access char a variable, 4 bytes required to
access int b variable, and other 4 bytes required to access a single character of ' c' variable.
1. #include <stdio.h>
2. #pragma pack(1)
3. struct base
415 | P a g e
4. {
5. int a;
6. char b;
7. double c;
8. };
9. int main()
10. {
11. struct base var; // variable declaration of type base
12. // Displaying the size of the structure base
13. printf("The size of the var is : %d", sizeof(var));
14. return 0;
15. }
In the above code, we have used the #pragma pack(1) directive to avoid the structure padding. If we
do not use this directive, then the output of the above program would be 16 bytes. But the actual size
of the structure members is 13 bytes, so 3 bytes are wasted. To avoid the wastage of memory, we use
the #pragma pack(1) directive to provide the 1-byte packaging.
Output
o By using attribute
1. #include <stdio.h>
2.
3. struct base
4. {
5. int a;
6. char b;
7. double c;
8. }__attribute__((packed)); ;
9. int main()
10. {
11. struct base var; // variable declaration of type base
12. // Displaying the size of the structure base
416 | P a g e
13. printf("The size of the var is : %d", sizeof(var));
14.
15. return 0;
16. }
Output
Union in C
Union can be defined as a user-defined data type which is a collection of different variables of
different data types in the same memory location. The union can also be defined as many members,
but only one member can contain a value at a particular point in time.
Union is a user-defined data type, but unlike structures, they share the same memory location.
1. struct abc
2. {
3. int a;
4. char b;
5. }
The above code is the user-defined structure that consists of two members, i.e., 'a' of type int and 'b'
of type character. When we check the addresses of 'a' and 'b', we found that their addresses are
different. Therefore, we conclude that the members in the structure do not share the same memory
location.
When we define the union, then we found that union is defined in the same way as the structure is
defined but the difference is that union keyword is used for defining the union data type, whereas the
struct keyword is used for defining the structure. The union contains the data members, i.e., 'a' and 'b',
when we check the addresses of both the variables then we found that both have the same addresses.
It means that the union members share the same memory location.
417 | P a g e
The below figure shows the pictorial representation of the structure. The structure has two members;
i.e., one is of integer type, and the another one is of character type. Since 1 block is equal to 1 byte;
therefore, 'a' variable will be allocated 4 blocks of memory while 'b' variable will be allocated 1 block
of memory.
The below figure shows the pictorial representation of union members. Both the variables are sharing
the same memory location and having the same initial address.
In union, members will share the memory location. If we try to make changes in any of the member
then it will be reflected to the other member as well. Let's understand this concept through an
example.
1. union abc
2. {
3. int a;
4. char b;
5. }var;
6. int main()
7. {
8. var.a = 66;
9. printf("\n a = %d", var.a);
10. printf("\n b = %d", var.b);
11. }
In the above code, union has two members, i.e., 'a' and 'b'. The 'var' is a variable of union abc type. In
the main() method, we assign the 66 to 'a' variable, so var.a will print 66 on the screen. Since both 'a'
and 'b' share the memory location, var.b will print 'B' (ascii code of 66).
1. union abc{
2. int a;
3. char b;
4. float c;
5. double d;
6. };
418 | P a g e
7. int main()
8. {
9. printf("Size of union abc is %d", sizeof(union abc));
10. return 0;
11. }
As we know, the size of int is 4 bytes, size of char is 1 byte, size of float is 4 bytes, and the size of
double is 8 bytes. Since the double variable occupies the largest memory among all the four variables,
so total 8 bytes will be allocated in the memory. Therefore, the output of the above program would
be 8 bytes.
1. #include <stdio.h>
2. union abc
3. {
4. int a;
5. char b;
6. };
7. int main()
8. {
9. union abc *ptr; // pointer variable declaration
10. union abc var;
11. var.a= 90;
12. ptr = &var;
13. printf("The value of a is : %d", ptr->a);
14. return 0;
15. }
In the above code, we have created a pointer variable, i.e., *ptr, that stores the address of var variable.
Now, ptr can access the variable 'a' by using the (->) operator. Hence the output of the above code
would be 90.
Store owners want to store the records of the above-mentioned two items along with the relevant
information. For example, Books include Title, Author, no of pages, price, and Shirts include Color,
design, size, and price. The 'price' property is common in both items. The Store owner wants to store
the properties, then how he/she will store the records.
1. struct store
2. {
3. double price;
4. char *title;
5. char *author;
6. int number_pages;
7. int color;
8. int size;
9. char *design;
10. };
The above structure consists of all the items that store owner wants to store. The above structure is
completely usable but the price is common property in both the items and the rest of the items are
individual. The properties like price, *title, *author, and number_pages belong to Books while color,
size, *design belongs to Shirt.
1. int main()
2. {
3. struct store book;
4. book.title = "C programming";
5. book.author = "Paulo Cohelo";
6. book.number_pages = 190;
7. book.price = 205;
8. printf("Size is : %ld bytes", sizeof(book));
9. return 0;
10. }
420 | P a g e
In the above code, we have created a variable of type store. We have assigned the values to the
variables, title, author, number_pages, price but the book variable does not possess the properties
such as size, color, and design. Hence, it's a wastage of memory. The size of the above structure
would be 44 bytes.
1. #include <stdio.h>
2. struct store
3. {
4. double price;
5. union
6. {
7. struct{
8. char *title;
9. char *author;
10. int number_pages;
11. } book;
12.
13. struct {
14. int color;
15. int size;
16. char *design;
17. } shirt;
18. }item;
19. };
20. int main()
21. {
22. struct store s;
23. s.item.book.title = "C programming";
24. s.item.book.author = "John";
25. s.item.book.number_pages = 189;
26. printf("Size is %ld", sizeof(s));
27. return 0;
28. }
In the above code, we have created a variable of type store. Since we used the unions in the above
code, so the largest memory occupied by the variable would be considered for the memory
421 | P a g e
allocation. The output of the above program is 32 bytes. In the case of structures, we obtained 44
bytes, while in the case of unions, the size obtained is 44 bytes. Hence, 44 bytes is greater than 32
bytes saving lots of memory space.
C FILE HANDLIND
File handling in C
In programming, we may require some specific input data to be generated several numbers of times.
Sometimes, it is not enough to only display the data on the console. The data to be displayed may be very large,
and only a limited amount of data can be displayed on the console, and since the memory is volatile, it is
impossible to recover the programmatically generated data again and again. However, if we need to do so, we
may store it onto the local file system which is volatile and can be accessed every time. Here, comes the need of
file handling in C.
File handling in C enables us to create, update, read, and delete the files stored on the local file system through
our C program. The following operations can be performed on a file.
ADVERTISEMENT
ADVERTISEMENT
422 | P a g e
Functions for file handling
There are many functions in the C library to open, read, write, search and close the file. A list of file functions
are given below:
423 | P a g e
o The file name (string). If the file is stored at some specific location, then we must mention the path at
which the file is stored. For example, a file name can be like "c://some_folder/some_file.ext".
o The mode in which the file is to be opened. It is a string.
Mode Description
424 | P a g e
o Then, it loads the file from the disk and place it into the buffer. The buffer is used to provide efficiency
for the read operations.
o It sets up a character pointer which points to the first character of the file.
1. #include<stdio.h>
2. void main( )
3. {
4. FILE *fp ;
5. char ch ;
6. fp = fopen("file_handle.c","r") ;
7. while ( 1 )
8. {
9. ch = fgetc ( fp ) ;
10. if ( ch == EOF )
11. break ;
12. printf("%c",ch) ;
13. }
14. fclose (fp ) ;
15. }
Output
#include;
void main( )
{
FILE *fp; // file pointer
char ch;
fp = fopen("file_handle.c","r");
while ( 1 )
{
ch = fgetc ( fp ); //Each character of the file is read and stored in the character file.
if ( ch == EOF )
break;
printf("%c",ch);
}
fclose (fp );
}
C fseek()
C fseek() example
Syntax:
Example:
1. #include <stdio.h>
2. main(){
3. FILE *fp;
4. fp = fopen("file.txt", "w");//opening file
5. fprintf(fp, "Hello file by fprintf...\n");//writing data into file
6. fclose(fp);//closing file
7. }
426 | P a g e
Reading File : fscanf() function
The fscanf() function is used to read set of characters from file. It reads a word from the file and
returns EOF at the end of file.
Syntax:
Example:
1. #include <stdio.h>
2. main(){
3. FILE *fp;
4. char buff[255];//creating char array to store data of file
5. fp = fopen("file.txt", "r");
6. while(fscanf(fp, "%s", buff)!=EOF){
7. printf("%s ", buff );
8. }
9. fclose(fp);
10. }
Output:
1. #include <stdio.h>
2. void main()
3. {
4. FILE *fptr;
5. int id;
6. char name[30];
7. float salary;
427 | P a g e
8. fptr = fopen("emp.txt", "w+");/* open for writing */
9. if (fptr == NULL)
10. {
11. printf("File does not exists \n");
12. return;
13. }
14. printf("Enter the id\n");
15. scanf("%d", &id);
16. fprintf(fptr, "Id= %d\n", id);
17. printf("Enter the name \n");
18. scanf("%s", name);
19. fprintf(fptr, "Name= %s\n", name);
20. printf("Enter the salary\n");
21. scanf("%f", &salary);
22. fprintf(fptr, "Salary= %.2f\n", salary);
23. fclose(fptr);
24. }
Output:
Enter the id
1
Enter the name
sonoo
Enter the salary
120000
Now open file from current directory. For windows operating system, go to TC\bin directory, you will
see emp.txt file. It will have following information.
emp.txt
Id= 1
Name= sonoo
Salary= 120000
428 | P a g e
Writing File : fputs() function
The fputs() function writes a line of characters into file. It outputs string to a stream.
Syntax:
Example:
1. #include<stdio.h>
2. #include<conio.h>
3. void main(){
4. FILE *fp;
5. clrscr();
6.
7. fp=fopen("myfile2.txt","w");
8. fputs("hello c programming",fp);
9.
10. fclose(fp);
11. getch();
12. }
myfile2.txt
hello c programming
Syntax:
Example:
1. #include<stdio.h>
2. #include<conio.h>
429 | P a g e
3. void main(){
4. FILE *fp;
5. char text[300];
6. clrscr();
7.
8. fp=fopen("myfile2.txt","r");
9. printf("%s",fgets(text,200,fp));
10.
11. fclose(fp);
12. getch();
13. }
Output:
hello c programming
C fseek() function
The fseek() function is used to set the file pointer to the specified offset. It is used to write data into
file at desired location.
Syntax:
There are 3 constants used in the fseek() function for whence: SEEK_SET, SEEK_CUR and SEEK_END.
Example:
1. #include <stdio.h>
2. void main(){
3. FILE *fp;
4.
5. fp = fopen("myfile.txt","w+");
6. fputs("This is javatpoint", fp);
7.
8. fseek( fp, 7, SEEK_SET );
9. fputs("sonoo jaiswal", fp);
10. fclose(fp);
430 | P a g e
11. }
myfile.txt
File*: The FILE *stream argument is a reference to the file's associated FILE structure. By utilizing
the fopen() method, it is acquired.
Long int offset: The offset parameter specifies how many bytes will relocated to the whence
parameter's location. It may be zero, positive, or negative.
Whence is an integer that indicates the reference place from which the offset is determined. Any one
of the following three constants may be used:
The file pointer is being moved: You can shift the file pointer to a specified area of the file using
the fseek() method. You can change the reference point for the offset by altering the 'whence'
parameter to one of the values SEEK_SET, SEEK_CUR, or SEEK_END.
Putting Data in the Right Place: Using operations like fprintf(), fputs(), fwrite(), etc., you may write
data after shifting the file reference to the correct spot. The data will be written beginning at the file
pointer's new location.
A file position indicator update: The fseek() method automatically updates the file position
indication to reflect the changed location of the file pointer. By doing this, you may be confident that
the file will always be operated on from the right angle.
431 | P a g e
Regular Use Cases of fseek()
There are several regular use cases of fseek() function. Some use cases are as follows:
Random Access: The fseek() function allows you random access to a file, enabling you
to read or write data at any point you want inside the file. It is especially beneficial for huge files or
databases when sequential data access is not the most effective method.
Modifying Existing Data: Without rewriting the whole file, fseek() lets you edit data at specified
locations inside a file. You can replace or insert new data while keeping the present contents by
shifting the file pointer to the appropriate spot.
Data Appending: You may relocate the file pointer to the end of the file and add additional data by
using the fseek() function with the SEEK_END constant. It is quite helpful when working with log
files or adding entries to an existing file.
Reading Specific Portions: You can read only the information you need by using the fseek()
function to move to a specific location inside a file. Working with huge files or structured data can
improve file reading procedures.
Metadata updating: In some circumstances, metadata may be present in places in files. You may
access these metadata sections using fseek() and make the necessary changes. It is typical when
working with file formats that include headers or other descriptive information.
Support for huge Files: The fseek() function is compatible with huge files when given a file
offset of type long int. You may now work with files that are larger than what is allowed by standard
file operations.
Considerations for Performance: Although fseek() function offers flexibility, frequent use of
random-access operations can have an adverse effect on speed, particularly with big files. Consider
the trade-off between convenience and performance when considering whether to use fseek() for file
manipulation.
Here are several examples of how to use the C fseek() function and their accompanying results:
Example 1:
Consider the following text in a file called "data.txt":
1. Line 1
2. Line 2
3. Line 3
4. Line 4
432 | P a g e
5. Line 5
Code:
1. #include <stdio.h>
2.
3. int main() {
4. FILE *file = fopen("data.txt", "r");
5. if (file == NULL) {
6. printf("Unable to open the file.\n");
7. return 1;
8. }
9.
10. char line[100];
11. fseek(file, 4, SEEK_SET); // Move to the beginning of the fourth line
12. fgets(line, sizeof(line), file);
13. printf("Fourth line: %s", line);
14.
15. fclose(file);
16. return 0;
17. }
Output:
Example 2:
Let's say we have a binary file called "data.bin" that contains the following information:
1. 1 2 3 4 5
Code:
1. #include <stdio.h>
2.
3. int main() {
4. FILE *file = fopen("data.bin", "r+b");
5. if (file == NULL) {
6. printf("Unable to open the file.\n");
433 | P a g e
7. return 1;
8. }
9.
10. int value = 10;
11. fseek(file, 3 * sizeof(int), SEEK_SET); // Move to the fourth integer (zero-based index)
12. fwrite(&value, sizeof(int), 1, file);
13.
14. fclose(file);
15. return 0;
16. }
Output:
Example 3:
Consider the following text in a file called "log.txt":
1. Log entry 1
2. Log entry 2
Code:
1. #include <stdio.h>
2.
3. int main() {
4. FILE *file = fopen("log.txt", "a");
5. if (file == NULL) {
6. printf("Unable to open the file.\n");
7. return 1;
8. }
9.
10. fseek(file, 0, SEEK_END); // Move to the end of the file
11. fputs("\nLog entry 3", file);
12.
13. fclose(file);
14. return 0;
15. }
434 | P a g e
Output:
Log entry 1
Log entry 2
Log entry 3
Example 4:
1. #include <stdio.h>
2. int main() {
3. FILE *file = fopen("data.txt", "r");
4. if (file == NULL) {
5. printf("Unable to open the file.\n");
6. return 1;
7. }
8.
9. fseek(file, 0, SEEK_END); // Move to the end of the file
10. long size = ftell(file); // Get the file size
11. printf("File size: %ld bytes\n", size);
12.
13. fclose(file);
14. return 0;
15. }
Output:
The fseek() function in the C language allows programmers to set the file pointer to a given offset
inside a file, making it an essential tool for file manipulation. Developers may perform various tasks,
including random access, adding data, editing existing material, and reading particular file
sections, skillfully utilizing the fseek() function.
For fseek() to operate properly, it is crucial to comprehend its syntax, which comprises the FILE
pointer, offset, and whence arguments. The reference location from which the offset is computed is
determined by the three variables SEEK_SET, SEEK_CUR, and SEEK_END, enabling precise control
over the movement of the file pointer.
Programmers may manage big files, access data structures in binary files, and modify metadata
sections with the help of fseek(). Additionally, the function has error-handling features that make it
possible to identify and fix problems like looking outside of file boundaries or using closed files.
435 | P a g e
When using fseek(), it's crucial to consider the compromise between ease and speed. Performance
can be impacted by excessive random-access operations, especially when dealing with big files.
Therefore, it is essential to analyze how to optimize file handling and reduce pointless carefully seeks.
Developers may improve their ability to manipulate files by understanding the fseek() method, which
will make their programs more effective, adaptable, and resilient. Programmers can easily handle
sophisticated file operations due to fseek(), which enables file navigation, data modification, and
content adding.
fseek() is a useful tool for manipulating file pointers and accessing data at precise points in the world
of file management in C. By embracing and comprehending the potential of fseek(), developers may
handle files with a new degree of precision and control, resulting in more complex and useful
programs.
C rewind() function
The rewind() function sets the file pointer at the beginning of the stream. It is useful if you have to use
stream many times.
Syntax:
Example:
File: file.txt
1. #include<stdio.h>
2. #include<conio.h>
3. void main(){
4. FILE *fp;
5. char c;
6. clrscr();
7. fp=fopen("file.txt","r");
8.
9. while((c=fgetc(fp))!=EOF){
10. printf("%c",c);
11. }
12.
436 | P a g e
13. rewind(fp);//moves the file pointer at beginning of the file
14.
15. while((c=fgetc(fp))!=EOF){
16. printf("%c",c);
17. }
18.
19. fclose(fp);
20. getch();
21. }
Output:
As you can see, rewind() function moves the file pointer at beginning of the file that is why "this is
simple text" is printed 2 times. If you don't call rewind() function, "this is simple text" will be printed
only once.
C ftell() function
The ftell() function returns the current file position of the specified stream. We can use ftell() function
to get the total size of a file after moving file pointer at the end of file. We can use SEEK_END constant
to move the file pointer at the end of file.
Syntax:
Example:
File: ftell.c
1. #include <stdio.h>
2. #include <conio.h>
3. void main (){
4. FILE *fp;
5. int length;
6. clrscr();
7. fp = fopen("file.txt", "r");
8. fseek(fp, 0, SEEK_END);
9.
437 | P a g e
10. length = ftell(fp);
11.
12. fclose(fp);
13. printf("Size of file: %d bytes", length);
14. getch();
15. }
Output:
Explanation:
Using fseek(fp, 0, SEEK_END), the program accesses the file "file.txt" in read mode and advances
the file pointer to the end. Using ftell(fp), it obtains the file location, which represents the file size.
Finally, the program uses the printf() function to output the file's size in bytes. The result shows
that "file.txt" has 21 bytes in it. You should take note of the program's use of uncommon functions
like clrscr() and getch().
Knowing the file's position and size is crucial for various tasks when working with files in C
programming. As the preceding example shows, the ftell() function is essential in giving this
information. Let's look more closely at some additional crucial file operations and ideas since file
management encompasses more than simply determining the file size.
Modes for Opening Files: In the example, we opened the file in "r" mode. This mode indicates read-
only access. Additional access modes are available, including "w" for writing (creates a new file or
overwrites an existing one), "a" for append (writes at the end of the file), "rb" for binary
read, "wb" for binary write, etc. It is essential to comprehend and use the proper file modes to
guarantee that the correct file actions are carried out.
Error Handling: It's critical to manage potential failures when working with file operations properly. If
the fopen() method cannot open the file, it returns NULL. Therefore, looking at the return value and
responding appropriately is crucial if the file opening doesn't succeed. Error management helps you
find and fix possible problems and prevent program crashes.
File Reading and Writing: Although the function ftell() is generally used to determine the size of a
file, file handling frequently includes reading data from and writing data to files. For these uses, C
has several methods, including fread(), fwrite(), fgets(), and fputs(). You may efficiently modify the
content of files by becoming familiar with and using these functions.
File Seeking: The fseek() function is used in conjunction with ftell() to adjust the file position
indication to a particular point inside the file. It is helpful when you want to read or write data from a
438 | P a g e
specific location in the file. You can traverse a file and perform the necessary operations with
the fseek() function.
Text vs. Binary Mode: Both binary mode and text mode are available for opening files. While text
mode is used for text files, binary mode is appropriate for non-text files. Different platforms (such
as Windows and Unix-like systems) may treat newline characters differently when opening a file in
text mode. In binary mode, there are no such transformations and data is read, and written just as it
is.
Conclusion:
In conclusion, the C ftell() method is a helpful resource for locating the current file location and
retrieving the file size. Programmers may easily search through files and do actions by combining
them with the fseek() function. Successful file handling in C depends on the understanding and use
of file opening modes, error management, and many file-related functions. Furthermore,
understanding the differences between binary and text modes guarantees precise data handling. C
programmers who are skilled in file handling can read, write, and modify files efficiently, enabling the
creation of various programs with exact file operations.
439 | P a g e
C PREPROCESSOR
C Preprocessor Directives
The C preprocessor is a micro processor that is used by compiler to transform your code before
compilation. It is called micro preprocessor because it allows us to add macros.
o #include
o #define
o #undef
o #ifdef
o #ifndef
o #if
440 | P a g e
o #else
o #elif
o #endif
o #error
o #pragma
What is Macro??
C Macros
C macros provide a potent method for code reuse and simplification. They let programmers
construct symbolic names or phrases that are changed to certain values before the compilation
process begins. The use of more macros makes code easier to comprehend, maintain, and makes
mistakes less likely. In this article, we'll delve deeper into the concept of C macros and cover their
advantages, ideal usage scenarios, and potential hazards.
A macro is a segment of code which is replaced by the value of macro. Macro is defined by #define
directive. There are two types of macros:
1. Object-like Macros
2. Function-like Macros
Object-like Macros
The object-like macro is an identifier that is replaced by value. It is widely used to represent numeric
constants. For example:
1. #define PI 3.14
Here, PI is the macro name which will be replaced by the value 3.14.
Function-like Macros
The function-like macro looks like function call. For example:
441 | P a g e
Visit #define to see the full example of object-like and function-like macros.
C Predefined Macros
ANSI C defines many predefined macros that can be used in c program.
1. #include<stdio.h>
2. int main(){
3. printf("File :%s\n", __FILE__ );
4. printf("Date :%s\n", __DATE__ );
5. printf("Time :%s\n", __TIME__ );
6. printf("Line :%d\n", __LINE__ );
7. printf("STDC :%d\n", __STDC__ );
8. return 0;
9. }
Output:
File :simple.c
Date :Dec 6 2015
Time :12:28:46
Line :6
STDC :1
442 | P a g e
Advantages of Using Macros:
There are various advantages of Macros in C. Some main advantages of C macros are as follows:
Code reuse: By allowing developers to declare a piece of code just once and use it several
times, macros help to promote modular programming and minimize code duplication.
Code abbreviation: Macros make it possible to write clear, expressive code that is simpler to read
and comprehend the intentions of the programmer.
Macro Side consequences: Steer clear of macros with negative consequences. Multiple
evaluations of macro arguments may result in surprising results since macros are directly substituted.
Use capital letters to distinguish macro names from standard C identifiers and to make the code
easier to understand.
For object-like macros, use constants: If possible, use object-like macros for constants to make the
code more readable and make any necessary adjustments simpler.
Macros with Functions for Basic Operations: Use macros that resemble functions for
straightforward, one-line operations. Use normal functions in their place for more intricate processes.
Use Predefined Macros Wisely: While predefined macros like __DATE__, __TIME__, and __FILE__ are
useful for debugging and logging, don't rely on them for essential functions.
443 | P a g e
Macros and Conditional Compilation:
When conditional compilation is used, macros significantly contribute utilizing the #ifdef, #ifndef,
#else, and #endif directives. It gives the compiler the ability to include or reject code blocks
depending on precise criteria.
Conclusion:
As a result, C macros are a crucial component of the C programming language and give
programmers a strong tool for code reuse and optimization. Object-like macros act as symbolic
constants and improve code readability by giving numerical values names that make sense. The cost
of function calls has decreased, and efficiency is increased through function-like macros, which
operate as in lined code snippets.
Code reuse, code simplification, and conditional compilation are a few advantages of using
macros in C. Programmers can build modular code structures and streamline complicated procedures
by designing macros. Additionally, conditional compilation facilitates platform-specific functions
and debugging by enabling developers to include or remove code blocks based on certain criteria.
C #include
The #include preprocessor directive is used to paste code of given file into current file. It is used
include system-defined and user-defined header files. If included file is not found, compiler renders
error.
By the use of #include directive, we provide information to the preprocessor where to look for the
header files. There are two variants to use #include directive.
1. #include <filename>
2. #include "filename"
444 | P a g e
The #include <filename> tells the compiler to look for the directory where system header files are
held. In UNIX, it is \usr\include directory.
The #include "filename" tells the compiler to look in the current directory from where program is
running.
1. #include<stdio.h>
2. int main(){
3. printf("Hello C");
4. return 0;
5. }
Output:
Hello C
#include notes:
Note 1: In #include directive, comments are not recognized. So in case of #include <a//b>, a//b is
treated as filename.
Note 2: In #include directive, backslash is considered as normal text not escape sequence. So in case
of #include <a\nb>, a\nb is treated as filename.
Note 3: You can use only comment after filename otherwise it will give error.
C #define
The C programming language's #define preprocessor directive provides a strong and flexible tool
for declaring constants and producing macros. It conducts textual replacement before actual
compilation during the pre-processing phase of C programs, where it plays a significant role. By using
this functionality, developers may improve their code's readability, maintainability,
and effectiveness.
Developers may give meaningful names to fixed values when declaring constants using #define,
which makes the code easier to understand and maintain. Programmers can avoid hard coding values
throughout the code by using constants, which reduces errors and ensures consistency.
445 | P a g e
Additionally, #define makes it possible to create macros, which serve as code blocks. As they
substitute function calls and sometimes provide more control over program behavior, macros aid in
constructing short, effective lines of code. However, macros must be used carefully since they are
directly substituted in the code and, if incorrectly specified, might have unexpected outcomes.
The #define preprocessor directive is used to define constant or micro substitution. It can use any
basic data type.
Syntax:
1. #define token value
1. #include <stdio.h>
2. #define PI 3.14
3. main() {
4. printf("%f",PI);
5. }
Output:
3.140000
Explanation:
In this example, we define a constant PI with a value of 3.14. After that, the printf() function uses
the PI constant to display the value. This program's output after compilation and execution is as
follows:
1. #include <stdio.h>
2. #define MIN(a,b) ((a)<(b)?(a):(b))
3. void main() {
4. printf("Minimum between 10 and 20 is: %d\n", MIN(10,20));
5. }
Output:
Explanation:
446 | P a g e
In this example, we develop a MIN macro that accepts the two inputs a and b. The macro's definition
returns the lowest value between the two inputs. The preprocessor replaces the MIN macro with the
actual code implementation when it is used with the inputs (10, 20), resulting in ((10) (20)? (10):
(20)). It is equal to 10, which shows in the output.
Uses:
There are several uses of #define preproceesor directive in C. Some of the uses are as follows:
Constant Definition: The #define is widely used in C programs to declare constants. Developers can
improve the readability and maintainability of their code by giving fixed values names that make
sense.
Making macros: Making macros enables programmers to define code snippets that may be used
repeatedly throughout the program. By minimizing function calls and minimizing code duplication,
this feature facilitates the construction of more effective and concise code.
Conditional Compilation: The directives #ifdef, #ifndef, #if, and #elif are frequently used in
combination with the directive #define. It gives developers the ability to include or omit code blocks
depending on predetermined criteria.
Configuration management: The #define can be used in big software projects to control
configuration settings and switch between them quickly during development or deployment.
Feature Toggles: In the code, you may toggle individual features or functions by using
the #define statement. Developers can activate or disable sections of the codebase by declaring
or undefining symbols.
Debugging and logging: The #define is used to activate or disable debugging statements or
logging messages throughout the software. It aids in finding and fixing problems throughout the
development and testing phases.
Math and Scientific Constants: Mathematical constants like PI, E, and other numbers may be
declared using #define, making their use in computations simple and reliable.
Conclusion:
In conclusion, the C #define preprocessor directive is a flexible and effective tool that programmers
may use to declare constants, build macros, and control code settings. C programmers may improve
code readability, maintainability, and efficiency by giving constants meaningful names and
creating reusable code blocks using macros. Customizing code behavior for various contexts is made
easier by #define's conditional compilation capabilities and feature toggles. When utilizing macros,
care must be taken to avoid potential problems and undesirable outcomes. Overall, #define is very
447 | P a g e
important to the C programming language and helps it become popular and widely used in a variety
of software development projects.
C #undef
The #undef preprocessor directive is used to undefine the constant or macro defined by #define.
Syntax:
1. #undef token
1. #include <stdio.h>
2. #define PI 3.14
3. #undef PI
4. main() {
5. printf("%f",PI);
6. }
Output:
The #undef directive is used to define the preprocessor constant to a limited scope so that you can
declare constant again.
Let's see an example where we are defining and undefining number variable. But before being
undefined, it was used by square variable.
1. #include <stdio.h>
2. #define number 15
3. int square=number*number;
4. #undef number
5. main() {
6. printf("%d",square);
7. }
Output:
448 | P a g e
225
C #ifdef
The #ifdef preprocessor directive checks if macro is defined by #define. If yes, it executes the code
otherwise #else code is executed, if present.
Syntax:
1. #ifdef MACRO
2. //code
3. #endif
1. #ifdef MACRO
2. //successful code
3. #else
4. //else code
5. #endif
C #ifdef example
Let's see a simple example to use #ifdef preprocessor directive.
1. #include <stdio.h>
2. #include <conio.h>
3. #define NOINPUT
4. void main() {
5. int a=0;
6. #ifdef NOINPUT
7. a=2;
8. #else
9. printf("Enter a:");
10. scanf("%d", &a);
11. #endif
12. printf("Value of a: %d\n", a);
449 | P a g e
13. getch();
14. }
Output:
Value of a: 2
But, if you don't define NOINPUT, it will ask user to enter a number.
1. #include <stdio.h>
2. #include <conio.h>
3. void main() {
4. int a=0;
5. #ifdef NOINPUT
6. a=2;
7. #else
8. printf("Enter a:");
9. scanf("%d", &a);
10. #endif
11.
12. printf("Value of a: %d\n", a);
13. getch();
14. }
Output:
Enter a:5
Value of a: 5
C #ifndef
The #ifndef preprocessor directive checks if macro is not defined by #define. If yes, it executes the
code otherwise #else code is executed, if present.
Syntax:
1. #ifndef MACRO
2. //code
3. #endif
450 | P a g e
Syntax with #else:
1. #ifndef MACRO
2. //successful code
3. #else
4. //else code
5. #endif
C #ifndef example
Let's see a simple example to use #ifndef preprocessor directive.
1. #include <stdio.h>
2. #include <conio.h>
3. #define INPUT
4. void main() {
5. int a=0;
6. #ifndef INPUT
7. a=2;
8. #else
9. printf("Enter a:");
10. scanf("%d", &a);
11. #endif
12. printf("Value of a: %d\n", a);
13. getch();
14. }
Output:
Enter a:5
Value of a: 5
But, if you don't define INPUT, it will execute the code of #ifndef.
1. #include <stdio.h>
2. #include <conio.h>
3. void main() {
4. int a=0;
5. #ifndef INPUT
6. a=2;
451 | P a g e
7. #else
8. printf("Enter a:");
9. scanf("%d", &a);
10. #endif
11. printf("Value of a: %d\n", a);
12. getch();
13. }
Output:
Value of a: 2
C #if
The #if preprocessor directive evaluates the expression or condition. If condition is true, it executes
the code otherwise #elseif or #else or #endif code is executed.
Syntax:
1. #if expression
2. //code
3. #endif
1. #if expression
2. //if code
3. #else
4. //else code
5. #endif
1. #if expression
2. //if code
3. #elif expression
4. //elif code
5. #else
6. //else code
452 | P a g e
7. #endif
C #if example
Let's see a simple example to use #if preprocessor directive.
1. #include <stdio.h>
2. #include <conio.h>
3. #define NUMBER 0
4. void main() {
5. #if (NUMBER==0)
6. printf("Value of Number is: %d",NUMBER);
7. #endif
8. getch();
9. }
Output:
1. #include <stdio.h>
2. #include <conio.h>
3. #define NUMBER 1
4. void main() {
5. clrscr();
6. #if (NUMBER==0)
7. printf("1 Value of Number is: %d",NUMBER);
8. #endif
9.
10. #if (NUMBER==1)
11. printf("2 Value of Number is: %d",NUMBER);
12. #endif
13. getch();
14. }
Output:
453 | P a g e
C #else
The #else preprocessor directive evaluates the expression or condition if condition of #if is false. It can
be used with #if, #elif, #ifdef and #ifndef directives.
Syntax:
1. #if expression
2. //if code
3. #else
4. //else code
5. #endif
1. #if expression
2. //if code
3. #elif expression
4. //elif code
5. #else
6. //else code
7. #endif
C #else example
Let's see a simple example to use #else preprocessor directive.
1. #include <stdio.h>
2. #include <conio.h>
3. #define NUMBER 1
4. void main() {
5. #if NUMBER==0
6. printf("Value of Number is: %d",NUMBER);
7. #else
8. print("Value of Number is non-zero");
9. #endif
10. getch();
11. }
454 | P a g e
Output:
C #error
The #error preprocessor directive indicates error. The compiler gives fatal error if #error directive is
found and skips further compilation process.
C #error example
Let's see a simple example to use #error preprocessor directive.
1. #include<stdio.h>
2. #ifndef __MATH_H
3. #error First include then compile
4. #else
5. void main(){
6. float a;
7. a=sqrt(7);
8. printf("%f",a);
9. }
10. #endif
Output:
1. #include<stdio.h>
2. #include<math.h>
3. #ifndef __MATH_H
4. #error First include then compile
5. #else
6. void main(){
7. float a;
8. a=sqrt(7);
9. printf("%f",a);
455 | P a g e
10. }
11. #endif
Output:
2.645751
C #pragma
The #pragma preprocessor directive is used to provide additional information to the compiler. The
#pragma directive is used by the compiler to offer machine or operating-system feature.
Syntax:
1. #pragma token
1. #pragma argsused
2. #pragma exit
3. #pragma hdrfile
4. #pragma hdrstop
5. #pragma inline
6. #pragma option
7. #pragma saveregs
8. #pragma startup
9. #pragma warn
1. #include<stdio.h>
2. #include<conio.h>
3.
4. void func() ;
5.
6. #pragma startup func
7. #pragma exit func
8.
456 | P a g e
9. void main(){
10. printf("\nI am in main");
11. getch();
12. }
13.
14. void func(){
15. printf("\nI am in func");
16. getch();
17. }
Output:
I am in func
I am in main
I am in func
To support command line argument, you need to change the structure of main() function as given
below.
Here, argc counts the number of arguments. It counts the file name as the first argument.
The argv[] contains the total number of arguments. The first argument is the file name always.
Example
Let's see the example of command line arguments where we are passing one argument with file
name.
1. #include <stdio.h>
2. void main(int argc, char *argv[] ) {
3.
4. printf("Program name is: %s\n", argv[0]);
5.
6. if(argc < 2){
457 | P a g e
7. printf("No argument passed through command line.\n");
8. }
9. else{
10. printf("First argument is: %s\n", argv[1]);
11. }
12. }
1. ./program hello
1. program.exe hello
Output:
Output:
But if you pass many arguments within double quote, all arguments will be treated as a single
argument only.
Output:
You can write your program to print all the arguments. In this program, we are printing only argv[1],
that is why it is printing only one argument.
https://www.javatpoint.com/command-line-arguments-in-c
458 | P a g e
C MISK
C Expressions
An expression is a formula in which operands are linked to each other by the use of operators to
compute a value. An operand can be a function reference, a variable, an array element or a constant.
1. a-b;
In the above expression, minus character (-) is an operator, and a, and b are the two operands.
ADVERTISEMENT
o Arithmetic expressions
o Relational expressions
o Logical expressions
o Conditional expressions
Each type of expression takes certain types of operands and uses a specific set of operators.
Evaluation of a particular expression produces a specific value.
For example:
1. x = 9/2 + a-b;
The entire above line is a statement, not an expression. The portion after the equal is an expression.
459 | P a g e
Arithmetic Expressions
An arithmetic expression is an expression that consists of operands and arithmetic operators. An
arithmetic expression computes a value of type int, float or double.
When an expression contains only integral operands, then it is known as pure integer expression
when it contains only real operands, it is known as pure real expression, and when it contains both
integral and real operands, it is known as mixed mode expression.
ADVERTISEMENT
The expressions are evaluated by performing one operation at a time. The precedence and
associativity of operators decide the order of the evaluation of individual operations.
When individual operations are performed, the following cases can be happened:
o When both the operands are of type integer, then arithmetic will be performed, and the result of the
operation would be an integer value. For example, 3/2 will yield 1 not 1.5 as the fractional part is
ignored.
o When both the operands are of type float, then arithmetic will be performed, and the result of the
operation would be a real value. For example, 2.0/2.0 will yield 1.0, not 1.
o If one operand is of type integer and another operand is of type real, then the mixed arithmetic will be
performed. In this case, the first operand is converted into a real operand, and then arithmetic is
performed to produce the real value. For example, 6/2.0 will yield 3.0 as the first value of 6 is converted
into 6.0 and then arithmetic is performed to produce 3.0.
460 | P a g e
Let's understand through an example.
Relational Expressions
o A relational expression is an expression used to compare two operands.
o It is a condition which is used to decide whether the action should be taken or not.
o In relational expressions, a numeric value cannot be compared with the string value.
o The result of the relational expression can be either zero or non-zero value. Here, the zero value is
equivalent to a false and non-zero value is equivalent to true.
Relational Description
Expression
x%2 = = 0 This condition is used to check whether the x is an even number or not. The relational
expression results in value 1 if x is an even number otherwise results in value 0.
461 | P a g e
a!=b It is used to check whether a is not equal to b. This relational expression results in 1 if a is
not equal to b otherwise 0.
a+b = = x+y It is used to check whether the expression "a+b" is equal to the expression "x+y".
1. #include <stdio.h>
2. int main()
3. {
4.
5. int x=4;
6. if(x%2==0)
7. {
8. printf("The number x is even");
9. }
10. else
11. printf("The number x is not even");
12. return 0;
13. }
Output
Logical Expressions
o A logical expression is an expression that computes either a zero or non-zero value.
462 | P a g e
o It is a complex test condition to take a decision.
Logical Description
Expressions
( x > 4 ) && ( x < It is a test condition to check whether the x is greater than 4 and x is less than 6. The
6) result of the condition is true only when both the conditions are true.
x > 10 || y <11 It is a test condition used to check whether x is greater than 10 or y is less than 11. The
result of the test condition is true if either of the conditions holds true value.
! ( x > 10 ) && ( y = It is a test condition used to check whether x is not greater than 10 and y is equal to 2.
=2) The result of the condition is true if both the conditions are true.
1. #include <stdio.h>
2. int main()
3. {
4. int x = 4;
5. int y = 10;
6. if ( (x <10) && (y>5))
7. {
8. printf("Condition is true");
9. }
10. else
11. printf("Condition is false");
12. return 0;
13. }
Output
463 | P a g e
Let's see a simple example of "| |" operator
ADVERTISEMENT
1. #include <stdio.h>
2. int main()
3. {
4. int x = 4;
5. int y = 9;
6. if ( (x <6) || (y>10))
7. {
8. printf("Condition is true");
9. }
10. else
11. printf("Condition is false");
12. return 0;
13. }
Output
Conditional Expressions
o A conditional expression is an expression that returns 1 if the condition is true otherwise 0.
464 | P a g e
o A conditional operator is also known as a ternary operator.
ADVERTISEMENT
ADVERTISEMENT
The above expression is a conditional expression which is evaluated on the basis of the value of the
exp1 expression. If the condition of the expression exp1 holds true, then the final conditional
expression is represented by exp2 otherwise represented by exp3.
1. #include<stdio.h>
2. #include<string.h>
3. int main()
4. {
5. int age = 25;
6. char status;
7. status = (age>22) ? 'M': 'U';
8. if(status == 'M')
9. printf("Married");
10. else
11. printf("Unmarried");
12. return 0;
13. }
Output
465 | P a g e
466 | P a g e