×

Const vs Volatile in C

Introduction

Qualifiers are nothing but keywords which are used to modify the properties of a variable. Const and Volatile keywords are qualifiers in C. The Const qualifier is applied to the variable declaration to specify the fact that the value of the variable will not be changed. On the other hand, the volatile qualifier is applied to declaration of any variable to specify that its value can face changes, i.e., it is modifiable.

The differences between the two qualifiers are as follows:

1) Const

The const type qualifier declares an object/variable to be nonmodifiable. But Optimization can be done on it.

2) Volatile

Volatile is a qualifier and a variable should be declared volatile whenever its value could change unexpectedly and no optimization is done on it.

The concept of volatile is somehow not understood well by many programmers and the main reason behind this could be the lack of real-world use of this keyword in typical C programs.

The programs in C are obviously high level, but the point to consider here is that volatile plays a key role in Embedded C Coding which is simply an extension of C language used for development of microcontroller-based applications.

Const in C

The const type qualifier declares an object/variable to be nonmodifiable. But, Optimization can be done on it.

The Objects declared with const-qualified types may be placed in read-only memory by the compiler, and if the address of a const object is never taken in a program, it may not be stored at all. For example,

 

 

Example

#include<stdio.h>
int main()
 {
   const int x = 10; // use of const qualifier
   x = 12;
   return 0;
}

Definition and declaration of Const

TypeDeclarationpointer value change (  *ptr = 100 )pointing value change (  ptr  = &a)
1) Pointer to Variableint * ptr     yes   yes
2) Pointer to Constantconst int * ptrint const * ptr  no   yes
3) Constant Pointer to Variableint * const ptr yes no
4) Constant Pointer to Constantconst int * const ptrno no

Definition of volatile

A volatile is a qualifier in C which basically prevents the compiler from performing any kind of optimization on the targeted object that can change in ways that the compiler cannot determine.

In simple terms, a variable declared as volatile is a volatile variable

  • That can change unexpectedly
  • No assumption regarding its value can be made by the compiler

Declaration of volatile

Syntax : volatile data_type variable name;  OR

                volatile data_type *variable_name;

Eg:

                volatile int p;

                volatile  int *p;

Let’s understand this keyword with the help of a program.

Program 1:  C program without the use of volatile qualifier

#define MEMORY_ADDRESS 0x1000U


int main(void)
{
int val = 0;  // declaration of local variables
int *v = (int *) MEMORY_ADDRESS;


while(1)
{
val = *v;
if (val) 
break;


}
return 0;
}

Code Explanation:

The above code works fine and will give the desired results if there are no optimizations performed by the compiler.

The piece of code will always go and read the value(val) stored at the address pointed by the pointer ‘v’.

But what happens if the compiler optimization occurs here?

If the compiler optimization occurs here and the value is updated by DMA or interrupt which is not under the scope of the compiler, then the compiler optimizes it by keeping a copy of the first read value. The value is kept here in order to avoid multiple memory read operations which are basically time consuming.

What is to understand here is that, in case the value at this address changes then it will never be updated here.

How to avoid this?

In order to avoid this, we need to explicitly inform the compiler that the pointer ‘v’ is volatile and hence the compiler must not optimize it or perform optimization on that pointer.

Program 2:  C program with the use of volatile qualifier

#define MEMORY_ADDRESS 0x1000U


int main(void)
{
int val = 0;    // declaration of local variables
volatile int *v = (int *) MEMORY_ADDRESS; //declaring the variable as volatile


while(1)
{
val = *v;
if (val) 
break;


}
return 0;
}

Code Explanation:

In the above code, we introduce the volatile keyword before declaring the pointer ‘v’. By doing this, we are explicitly telling the compiler that the pointer ‘v’ is volatile and hence the compiler must not optimize it.

Consequences of frequent use of volatile

Volatile qualifier may solve the problem of unwanted optimization done by the compiler but we must keep in mind the consequences it brings with frequent usage.

The volatile variable basically forces the compiler to not keep a copy of read values and fetch a fresh value from memory every time which takes more clock cycles, i.e., more time complexity.

Hence, it is always recommended that a variable should be declared volatile when the value of that variable could change unexpectedly.

Program 3:  C program with the use of Const qualifier

#include <stdio.h>


int main(void)
{
int x = 5;   // declaration of local variables
int y = 15;


int *const ptr = &x;  // use of const qualifier


printf("ptr: %d\n", *ptr);


*ptr = 100;  // valid statement
printf("ptr: %d\n", *ptr);


ptr = &y;	 /* error: assignment of read-only variable ‘ptr’ */
return 0;
}

The Difference between the two qualifiers can be summarized as follows:

3) Const

The const type qualifier declares an object/variable to be nonmodifiable. But Optimization can be done on it.

4) Volatile

Volatile is a qualifier and a variable should be declared volatile whenever its value could change unexpectedly and no optimization is done on it.


Related Topics

7 Best IDEs for C/C++ Developers in 2024

As we all know that in programming languages, C is known as the building block which cannot be contradicted, and C++ is the prolong kind of C and it can...

4 minutes read.

Self-referential structure in C

Self-referential structure in C A self-referential structure is a structure that can have members which point to a structure variable of the same type. They can have one or more pointers...

3 minutes read.

Beep() function in C

Introduction: Beep is a function which is used in C programming language. The beep function uses to make a beep sound. In the C language, when we want to generate...

3 minutes read.

Escape Sequence in C

An escape sequence is a sequence of character that used inside the string literal or character.  All the escape sequence is used with the backslash (\) symbol. The list of an...

1 minute read.

Palindrome Number in C

What is a Palindrome? A number that doesn't change when reversed is known as a palindrome. We reverse a number and compare it to the original number to determine whether it is...

4 minutes read.

C Data type

Data Types in C with Examples Data types are used to define the type of data that a variable can store to perform a specific operation.ANSI C provides three types of...

2 minutes read.

How to initialize array to zero in C

In this article, you will learn how to initialise an array to 0 in C In C, an array is declared as: char ZEROARRAY[2022]; The global scope changes at runtime to all zeros....

3 minutes read.

C Token

C Token and Keyword The C tokens are the basic buildings blocks in C language which are constructed together to write a C program. Each and every smallest individual unit in the C program is...

2 minutes read.

Unformatted input() and output() function in C

Unformatted Input and Output functions take the character, character array, and strings as input. We can read-only character data types with these functions. These functions are already defined in the...

5 minutes read.

Bank Account System in C using File Handling

This tells about the creation of bank account system using the C language and handling of files in C. Approach Let us see the approaches and the functions how they are covering...

5 minutes read.

Random Access - Lseek in C

Introduction lseek is a system call that is used to alter the location of the read/write pointer of a file descriptor. The lseek system call basically moves the current read/write location...

4 minutes read.

Decimal to Hexadecimal in C

Decimal to Hexadecimal in C Let us first understand the definitions of decimal and hexadecimal. In algebra, a decimal number is defined as a number whose whole number part and a...

3 minutes read.

Find Day from Day in C Without using function

Introduction: In the given article, I find daily in C without using functions. It takes 365 days for the earth to revolve around the sun. It will be close to...

3 minutes read.

Pointer to pointer in C

A pointer to another pointer is another type of multiple indirections and a chain of many pointers. Generally, a pointer consists of the address of the variable. Once a pointer to...

4 minutes read.

Builtin functions of GCC compiler

Certain built-in functions are present in the GCC compiler. These features are as follows: Function_ built in_popcount (x) The number of 1s in data of the integer type can be counted using...

3 minutes read.

How to create a node in C?

A node is a small concept taken from the graph theory, or a node is a fundamental unit of a data structure, like a tree data structure. Every graph contains...

3 minutes read.

How to Avoid Structure Padding in C

Generally, when an object of some structure type is declared, some contiguous memory will be allocated in block form, which will be allocated to structure members. To understand structure padding...

3 minutes read.

Decimal to Binary in C

What is a decimal number? A decimal number is a number represented in the decimal number system. This system of binary conversion uses base 10 to represent numbers, i.e. the digits...

3 minutes read.

For loop in C Programming

In the C programming language, the for loop is used to repeatedly iterate over a set of instructions or a section of code. It is frequently used to traverse array-based...

3 minutes read.

C Array

An array is a collection of elements that are used to hold the fixed number of values of the same type. We cannot change the size and type of array...

2 minutes read.