Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

C Lang

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 31

There are few pre defined data types like integers,float,charecter,null etc.

We could define our own data types as per our requirement and we could group any of
the pre defined data types.This type of data is called user defined data types.

Array- grouping of same type of elements.

String-grouping of characters

Structure-used to group different data types.

Union-usee to group different data types,but the collective size is equal to size of largest
data type.

These are the few examples of derived data type which you could use as pre defined data
type as per your requirement.

Derived Data Types


Derived data types are object types which are aggregates of one or more types of basic data types. The
most common derived data types are pointers, arrays, structures and unions. These data types have all
proven to be great additions to the C language and a programmer should understand them. A pointer is
essentially a value which points to another data space. An array is a collection of the same basic types of
data that is contiguous in memory. Structures are collection of different data types, but with the concept of
representing all contained information as a single object. A union is similar to a struct, only that a single
member can be used at a single time. Primary purpose is to implement a psuedo-polymorphism within a
C program. They are generally a lesser concern for new HPC applications and more more useful for
embedded programming. All below sections are loosely explained. This page describes pointers and
arrays. [[C Programming Language Structures and Unions|Structures and Unions]] describes structures
and unions.

Pointers
Pointers are very powerful in the C language. If you are in HPC and work in the C language, you should
be well aware of pointers. Pointers form a layer of indirection. The basic concept is that a pointer provides
a mechanism for determining the address of data. Pointers can reference any data type, basic or derived.
However, overusing pointers can often times cause large performance hits on the code being developed.
Too many layers of indirection can cause inefficiencies. To declare a pointer, preceed a variable name
with an * This will define that variable name as a pointer to a type of data. The following snippet shows
how to declare different types of pointers:
// Character pointer
char *char_ptr;

// Integer pointers
short *short_int_ptr;
int *reg_int_ptr;
long *long_int_ptr;

// floating point pointers


float *float_ptr;
double *double_ptr;
The note to take away is that pointers are always of the same size (usually determined by the OS, 4 bytes
for a 32-bit operating system (OS) and 8 bytes for a 64-bit OS, but no guarantee). The data that is held in
the pointer is an address to the data it is pointing at and not the actual value of the data. However one
can do a number of operations on the data by simply dereferencing a pointer. The following small
program shows how:

#include <stdio.h>

int main(int argc, char *argv[]){

// declare an integer and set the value to 5.


int a = 5;

// declare a pointer
int *b;

// set b to point to a, &a represents "address of a"


b = &a;

// print the relations


// print a by value
printf(" a = %d\n",a);
// print address of a
printf("&a = %ld\n",&a);

// print where b points to


printf(" b = %ld\n",b);

//print what b points to


printf("*b = %d\n",*b);

return 0;
}

Arrays
An array is a container for data which is of all the same type. The type can be a basic type or a derived
type. A C array is defined by using the square brackets [ ]. Between the square brackets usually exist
an integer, usually of the unsigned type since an array can never have a negative dimension, at least in
the C context. There are two types of arrays, static and dynamic. static arrays are defined during compile
time while dynamic arrays are defined at runtime. Usually HPC users always use dynamic arrays since
the data set is usually of varying length and that allows for different parameters to be used. Static arrays
declared as follows:
const unsigned int N = 50;
double array[N];

Dynamic arrays vary syntax-wise. They involve the use of pointers and the malloc() function which is
located in the standard library. The following program can declare a dynamic array.
// include the malloc() and free functions()
#include <stdlib.h>
// include the scanf() function
#include <stdio.h>
int main(int argc, char *argv[]){

// Size and pointer


unsigned int N;
double *array;

// Get user input


printf("Enter a size for the array: ");
scanf("%u",&N);

// Allocate memory <cast>malloc(N*sizeof(data_type))


array = (double*)malloc(N*sizeof(double));

// Process with array

// free memory free(pointer)


free(array);

return 0;
}

Note that whenever a dynamic array is used, the free() function should be used to release the memory
when the array is no longer needed. This is very important as if the free() function is not called after
a malloc() function, there are great chances for memory leaks and other errors.

Arrays a kind of data structure that can store a fixed-size sequential collection
of elements of the same type. An array is used to store a collection of data,
but it is often more useful to think of an array as a collection of variables of
the same type.

Instead of declaring individual variables, such as number0, number1, ..., and


number99, you declare one array variable such as numbers and use
numbers[0], numbers[1], and ..., numbers[99] to represent individual
variables. A specific element in an array is accessed by an index.

All arrays consist of contiguous memory locations. The lowest address


corresponds to the first element and the highest address to the last element.

Declaring Arrays
To declare an array in C, a programmer specifies the type of the elements
and the number of elements required by an array as follows −
type arrayName [ arraySize ];

This is called a single-dimensional array. The arraySize must be an integer


constant greater than zero and type can be any valid C data type. For
example, to declare a 10-element array called balance of type double, use
this statement −
double balance[10];

Here balance is a variable array which is sufficient to hold up to 10 double


numbers.

Initializing Arrays
You can initialize an array in C either one by one or using a single statement
as follows −
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

The number of values between braces { } cannot be larger than the number
of elements that we declare for the array between square brackets [ ].

If you omit the size of the array, an array just big enough to hold the
initialization is created. Therefore, if you write −
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};

You will create exactly the same array as you did in the previous example.
Following is an example to assign a single element of the array −
balance[4] = 50.0;

The above statement assigns the 5th element in the array with a value of
50.0. All arrays have 0 as the index of their first element which is also called
the base index and the last index of an array will be total size of the array
minus 1. Shown below is the pictorial representation of the array we
discussed above −

Accessing Array Elements


An element is accessed by indexing the array name. This is done by placing
the index of the element within square brackets after the name of the array.
For example −
double salary = balance[9];

The above statement will take the 10th element from the array and assign the
value to salary variable. The following example Shows how to use all the
three above mentioned concepts viz. declaration, assignment, and accessing
arrays −
Live Demo

#include <stdio.h>

int main () {

int n[ 10 ]; /* n is an array of 10 integers */

int i,j;

/* initialize elements of array n to 0 */

for ( i = 0; i < 10; i++ ) {

n[ i ] = i + 100; /* set element at location i to i + 100 */

/* output each array element's value */

for (j = 0; j < 10; j++ ) {

printf("Element[%d] = %d\n", j, n[j] );

return 0;

}
When the above code is compiled and executed, it produces the following
result −
Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109

Arrays in Detail
Arrays are important to C and should need a lot more attention. The following
important concepts related to array should be clear to a C programmer −

Sr.No. Concept & Description

1 Multi-dimensional arrays

C supports multidimensional arrays. The simplest form of the


multidimensional array is the two-dimensional array.

2 Passing arrays to functions


You can pass to the function a pointer to an array by specifying the array's
name without an index.

3 Return array from a function


C allows a function to return an array.

4 Pointer to an array
You can generate a pointer to the first element of an array by simply
specifying the array name, without any index.

Pointers in C are easy and fun to learn. Some C programming tasks are
performed more easily with pointers, and other tasks, such as dynamic
memory allocation, cannot be performed without using pointers. So it
becomes necessary to learn pointers to become a perfect C programmer.
Let's start learning them in simple and easy steps.

As you know, every variable is a memory location and every memory location
has its address defined which can be accessed using ampersand (&) operator,
which denotes an address in memory. Consider the following example, which
prints the address of the variables defined −
Live Demo

#include <stdio.h>

int main () {

int var1;

char var2[10];

printf("Address of var1 variable: %x\n", &var1 );

printf("Address of var2 variable: %x\n", &var2 );

return 0;

When the above code is compiled and executed, it produces the following
result −
Address of var1 variable: bff5a400
Address of var2 variable: bff5a3f6

What are Pointers?


A pointer is a variable whose value is the address of another variable, i.e.,
direct address of the memory location. Like any variable or constant, you
must declare a pointer before using it to store any variable address. The
general form of a pointer variable declaration is −
type *var-name;
Here, type is the pointer's base type; it must be a valid C data type and var-
name is the name of the pointer variable. The asterisk * used to declare a
pointer is the same asterisk used for multiplication. However, in this
statement the asterisk is being used to designate a variable as a pointer.
Take a look at some of the valid pointer declarations −
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */

The actual data type of the value of all pointers, whether integer, float,
character, or otherwise, is the same, a long hexadecimal number that
represents a memory address. The only difference between pointers of
different data types is the data type of the variable or constant that the
pointer points to.

How to Use Pointers?


There are a few important operations, which we will do with the help of
pointers very frequently. (a) We define a pointer variable, (b) assign the
address of a variable to a pointer and (c) finally access the value at the
address available in the pointer variable. This is done by using unary
operator * that returns the value of the variable located at the address
specified by its operand. The following example makes use of these
operations −
Live Demo

#include <stdio.h>

int main () {

int var = 20; /* actual variable declaration */

int *ip; /* pointer variable declaration */

ip = &var; /* store address of var in pointer variable*/


printf("Address of var variable: %x\n", &var );

/* address stored in pointer variable */

printf("Address stored in ip variable: %x\n", ip );

/* access the value using the pointer */

printf("Value of *ip variable: %d\n", *ip );

return 0;

When the above code is compiled and executed, it produces the following
result −
Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20

NULL Pointers
It is always a good practice to assign a NULL value to a pointer variable in
case you do not have an exact address to be assigned. This is done at the
time of variable declaration. A pointer that is assigned NULL is called
a nullpointer.

The NULL pointer is a constant with a value of zero defined in several standard
libraries. Consider the following program −
Live Demo

#include <stdio.h>

int main () {

int *ptr = NULL;


printf("The value of ptr is : %x\n", ptr );

return 0;

When the above code is compiled and executed, it produces the following
result −
The value of ptr is 0

In most of the operating systems, programs are not permitted to access


memory at address 0 because that memory is reserved by the operating
system. However, the memory address 0 has special significance; it signals
that the pointer is not intended to point to an accessible memory location.
But by convention, if a pointer contains the null (zero) value, it is assumed
to point to nothing.

To check for a null pointer, you can use an 'if' statement as follows −
if(ptr) /* succeeds if p is not null */
if(!ptr) /* succeeds if p is null */

Pointers in Detail
Pointers have many but easy concepts and they are very important to C
programming. The following important pointer concepts should be clear to
any C programmer −

Sr.No. Concept & Description

1 Pointer arithmetic

There are four arithmetic operators that can be used in pointers: ++, --,
+, -

2 Array of pointers
You can define arrays to hold a number of pointers.

3 Pointer to pointer
C allows you to have pointer on a pointer and so on.

4 Passing pointers to functions in C


Passing an argument by reference or by address enable the passed
argument to be changed in the calling function by the called function.

5 Return pointer from functions in C


C allows a function to return a pointer to the local variable, static variable,
and dynamically allocated memory as well.

Strings are actually one-dimensional array of characters terminated by


a nullcharacter '\0'. Thus a null-terminated string contains the characters
that comprise the string followed by a null.

The following declaration and initialization create a string consisting of the


word "Hello". To hold the null character at the end of the array, the size of
the character array containing the string is one more than the number of
characters in the word "Hello."
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

If you follow the rule of array initialization then you can write the above
statement as follows −
char greeting[] = "Hello";

Following is the memory presentation of the above defined string in C/C++



Actually, you do not place the null character at the end of a string constant.
The C compiler automatically places the '\0' at the end of the string when it
initializes the array. Let us try to print the above mentioned string −
Live Demo

#include <stdio.h>

int main () {

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

printf("Greeting message: %s\n", greeting );

return 0;

When the above code is compiled and executed, it produces the following
result −
Greeting message: Hello

C supports a wide range of functions that manipulate null-terminated strings


Sr.No. Function & Purpose

1 strcpy(s1, s2);

Copies string s2 into string s1.

2 strcat(s1, s2);

Concatenates string s2 onto the end of string s1.

3 strlen(s1);

Returns the length of string s1.


4 strcmp(s1, s2);

Returns 0 if s1 and s2 are the same; less than 0 if s1<s2; greater than 0
if s1>s2.

5 strchr(s1, ch);

Returns a pointer to the first occurrence of character ch in string s1.

6 strstr(s1, s2);

Returns a pointer to the first occurrence of string s2 in string s1.

The following example uses some of the above-mentioned functions −


Live Demo

#include <stdio.h>

#include <string.h>

int main () {

char str1[12] = "Hello";

char str2[12] = "World";

char str3[12];

int len ;

/* copy str1 into str3 */

strcpy(str3, str1);

printf("strcpy( str3, str1) : %s\n", str3 );

/* concatenates str1 and str2 */

strcat( str1, str2);


printf("strcat( str1, str2): %s\n", str1 );

/* total lenghth of str1 after concatenation */

len = strlen(str1);

printf("strlen(str1) : %d\n", len );

return 0;

When the above code is compiled and executed, it produces the following
result −
strcpy( str3, str1) : Hello
strcat( str1, str2): HelloWorld
strlen(str1) : 10

Arrays allow to define type of variables that can hold several data items of
the same kind. Similarly structure is another user defined data type
available in C that allows to combine data items of different kinds.

Structures are used to represent a record. Suppose you want to keep track
of your books in a library. You might want to track the following attributes
about each book −

 Title

 Author

 Subject

 Book ID

Defining a Structure
To define a structure, you must use the struct statement. The struct
statement defines a new data type, with more than one member. The format
of the struct statement is as follows −
struct [structure tag] {

member definition;

member definition;

...

member definition;

} [one or more structure variables];

The structure tag is optional and each member definition is a normal


variable definition, such as int i; or float f; or any other valid variable
definition. At the end of the structure's definition, before the final semicolon,
you can specify one or more structure variables but it is optional. Here is the
way you would declare the Book structure −

struct Books {

char title[50];

char author[50];

char subject[100];

int book_id;

} book;

Accessing Structure Members


To access any member of a structure, we use the member access operator
(.). The member access operator is coded as a period between the structure
variable name and the structure member that we wish to access. You would
use the keyword struct to define variables of structure type. The following
example shows how to use a structure in a program −
Live Demo

#include <stdio.h>

#include <string.h>
struct Books {

char title[50];

char author[50];

char subject[100];

int book_id;

};

int main( ) {

struct Books Book1; /* Declare Book1 of type Book */

struct Books Book2; /* Declare Book2 of type Book */

/* book 1 specification */

strcpy( Book1.title, "C Programming");

strcpy( Book1.author, "Nuha Ali");

strcpy( Book1.subject, "C Programming Tutorial");

Book1.book_id = 6495407;

/* book 2 specification */

strcpy( Book2.title, "Telecom Billing");

strcpy( Book2.author, "Zara Ali");

strcpy( Book2.subject, "Telecom Billing Tutorial");

Book2.book_id = 6495700;

/* print Book1 info */

printf( "Book 1 title : %s\n", Book1.title);

printf( "Book 1 author : %s\n", Book1.author);

printf( "Book 1 subject : %s\n", Book1.subject);


printf( "Book 1 book_id : %d\n", Book1.book_id);

/* print Book2 info */

printf( "Book 2 title : %s\n", Book2.title);

printf( "Book 2 author : %s\n", Book2.author);

printf( "Book 2 subject : %s\n", Book2.subject);

printf( "Book 2 book_id : %d\n", Book2.book_id);

return 0;

When the above code is compiled and executed, it produces the following
result −
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Structures as Function Arguments


You can pass a structure as a function argument in the same way as you pass
any other variable or pointer.
Live Demo

#include <stdio.h>

#include <string.h>

struct Books {

char title[50];

char author[50];

char subject[100];
int book_id;

};

/* function declaration */

void printBook( struct Books book );

int main( ) {

struct Books Book1; /* Declare Book1 of type Book */

struct Books Book2; /* Declare Book2 of type Book */

/* book 1 specification */

strcpy( Book1.title, "C Programming");

strcpy( Book1.author, "Nuha Ali");

strcpy( Book1.subject, "C Programming Tutorial");

Book1.book_id = 6495407;

/* book 2 specification */

strcpy( Book2.title, "Telecom Billing");

strcpy( Book2.author, "Zara Ali");

strcpy( Book2.subject, "Telecom Billing Tutorial");

Book2.book_id = 6495700;

/* print Book1 info */

printBook( Book1 );

/* Print Book2 info */

printBook( Book2 );
return 0;

void printBook( struct Books book ) {

printf( "Book title : %s\n", book.title);

printf( "Book author : %s\n", book.author);

printf( "Book subject : %s\n", book.subject);

printf( "Book book_id : %d\n", book.book_id);

When the above code is compiled and executed, it produces the following
result −
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

Pointers to Structures
You can define pointers to structures in the same way as you define pointer
to any other variable −
struct Books *struct_pointer;

Now, you can store the address of a structure variable in the above defined
pointer variable. To find the address of a structure variable, place the '&';
operator before the structure's name as follows −

struct_pointer = &Book1;

To access the members of a structure using a pointer to that structure, you


must use the → operator as follows −
struct_pointer->title;

Let us re-write the above example using structure pointer.


Live Demo

#include <stdio.h>

#include <string.h>

struct Books {

char title[50];

char author[50];

char subject[100];

int book_id;

};

/* function declaration */

void printBook( struct Books *book );

int main( ) {

struct Books Book1; /* Declare Book1 of type Book */

struct Books Book2; /* Declare Book2 of type Book */

/* book 1 specification */

strcpy( Book1.title, "C Programming");

strcpy( Book1.author, "Nuha Ali");

strcpy( Book1.subject, "C Programming Tutorial");

Book1.book_id = 6495407;

/* book 2 specification */
strcpy( Book2.title, "Telecom Billing");

strcpy( Book2.author, "Zara Ali");

strcpy( Book2.subject, "Telecom Billing Tutorial");

Book2.book_id = 6495700;

/* print Book1 info by passing address of Book1 */

printBook( &Book1 );

/* print Book2 info by passing address of Book2 */

printBook( &Book2 );

return 0;

void printBook( struct Books *book ) {

printf( "Book title : %s\n", book->title);

printf( "Book author : %s\n", book->author);

printf( "Book subject : %s\n", book->subject);

printf( "Book book_id : %d\n", book->book_id);

When the above code is compiled and executed, it produces the following
result −
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700
Bit Fields
Bit Fields allow the packing of data in a structure. This is especially useful
when memory or data storage is at a premium. Typical examples include −

 Packing several objects into a machine word. e.g. 1 bit flags can be compacted.

 Reading external file formats -- non-standard file formats could be read in, e.g.,
9-bit integers.

C allows us to do this in a structure definition by putting :bit length after the


variable. For example −

struct packed_struct {

unsigned int f1:1;

unsigned int f2:1;

unsigned int f3:1;

unsigned int f4:1;

unsigned int type:4;

unsigned int my_int:9;

} pack;

Here, the packed_struct contains 6 members: Four 1 bit flags f1..f3, a 4-bit
type and a 9-bit my_int.

C automatically packs the above bit fields as compactly as possible, provided


that the maximum length of the field is less than or equal to the integer word
length of the computer. If this is not the case, then some compilers may allow
memory overlap for the fields while others would store the next field in the
next word.

A union is a special data type available in C that allows to store different


data types in the same memory location. You can define a union with many
members, but only one member can contain a value at any given time. Unions
provide an efficient way of using the same memory location for multiple-
purpose.

Defining a Union
To define a union, you must use the union statement in the same way as
you did while defining a structure. The union statement defines a new data
type with more than one member for your program. The format of the union
statement is as follows −

union [union tag] {

member definition;

member definition;

...

member definition;

} [one or more union variables];

The union tag is optional and each member definition is a normal variable
definition, such as int i; or float f; or any other valid variable definition. At
the end of the union's definition, before the final semicolon, you can specify
one or more union variables but it is optional. Here is the way you would
define a union type named Data having three members i, f, and str −

union Data {

int i;

float f;

char str[20];

} data;

Now, a variable of Data type can store an integer, a floating-point number,


or a string of characters. It means a single variable, i.e., same memory
location, can be used to store multiple types of data. You can use any built-
in or user defined data types inside a union based on your requirement.

The memory occupied by a union will be large enough to hold the largest
member of the union. For example, in the above example, Data type will
occupy 20 bytes of memory space because this is the maximum space which
can be occupied by a character string. The following example displays the
total memory size occupied by the above union −
Live Demo

#include <stdio.h>

#include <string.h>

union Data {

int i;

float f;

char str[20];

};

int main( ) {

union Data data;

printf( "Memory size occupied by data : %d\n", sizeof(data));

return 0;

When the above code is compiled and executed, it produces the following
result −
Memory size occupied by data : 20

Accessing Union Members


To access any member of a union, we use the member access operator
(.). The member access operator is coded as a period between the union
variable name and the union member that we wish to access. You would use
the keyword union to define variables of union type. The following example
shows how to use unions in a program −
Live Demo

#include <stdio.h>

#include <string.h>

union Data {

int i;

float f;

char str[20];

};

int main( ) {

union Data data;

data.i = 10;

data.f = 220.5;

strcpy( data.str, "C Programming");

printf( "data.i : %d\n", data.i);

printf( "data.f : %f\n", data.f);

printf( "data.str : %s\n", data.str);

return 0;

}
When the above code is compiled and executed, it produces the following
result −
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

Here, we can see that the values of i and f members of union got corrupted
because the final value assigned to the variable has occupied the memory
location and this is the reason that the value of str member is getting printed
very well.

Now let's look into the same example once again where we will use one
variable at a time which is the main purpose of having unions −
Live Demo

#include <stdio.h>

#include <string.h>

union Data {

int i;

float f;

char str[20];

};

int main( ) {

union Data data;

data.i = 10;

printf( "data.i : %d\n", data.i);

data.f = 220.5;
printf( "data.f : %f\n", data.f);

strcpy( data.str, "C Programming");

printf( "data.str : %s\n", data.str);

return 0;

When the above code is compiled and executed, it produces the following
result −
data.i : 10
data.f : 220.500000
data.str : C Programming

Here, all the members are getting printed very well because one member is
being used at a time.

Suppose your C program contains a number of TRUE/FALSE variables


grouped in a structure called status, as follows −

struct {

unsigned int widthValidated;

unsigned int heightValidated;

} status;

This structure requires 8 bytes of memory space but in actual, we are going
to store either 0 or 1 in each of the variables. The C programming language
offers a better way to utilize the memory space in such situations.

If you are using such variables inside a structure then you can define the
width of a variable which tells the C compiler that you are going to use only
those number of bytes. For example, the above structure can be re-written
as follows −
struct {

unsigned int widthValidated : 1;

unsigned int heightValidated : 1;

} status;

The above structure requires 4 bytes of memory space for status variable,
but only 2 bits will be used to store the values.

If you will use up to 32 variables each one with a width of 1 bit, then also the
status structure will use 4 bytes. However as soon as you have 33 variables,
it will allocate the next slot of the memory and it will start using 8 bytes. Let
us check the following example to understand the concept −
Live Demo

#include <stdio.h>

#include <string.h>

/* define simple structure */

struct {

unsigned int widthValidated;

unsigned int heightValidated;

} status1;

/* define a structure with bit fields */

struct {

unsigned int widthValidated : 1;

unsigned int heightValidated : 1;

} status2;

int main( ) {
printf( "Memory size occupied by status1 : %d\n", sizeof(status1));

printf( "Memory size occupied by status2 : %d\n", sizeof(status2));

return 0;

When the above code is compiled and executed, it produces the following
result −
Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

Bit Field Declaration


The declaration of a bit-field has the following form inside a structure −

struct {

type [member_name] : width ;

};

The following table describes the variable elements of a bit field −

Sr.No. Element & Description

1 type

An integer type that determines how a bit-field's value is interpreted. The


type may be int, signed int, or unsigned int.

2 member_name

The name of the bit-field.

3 width

The number of bits in the bit-field. The width must be less than or equal
to the bit width of the specified type.
The variables defined with a predefined width are called bit fields. A bit field
can hold more than a single bit; for example, if you need a variable to store
a value from 0 to 7, then you can define a bit field with a width of 3 bits as
follows −

struct {

unsigned int age : 3;

} Age;

The above structure definition instructs the C compiler that the age variable
is going to use only 3 bits to store the value. If you try to use more than 3
bits, then it will not allow you to do so. Let us try the following example −
Live Demo

#include <stdio.h>

#include <string.h>

struct {

unsigned int age : 3;

} Age;

int main( ) {

Age.age = 4;

printf( "Sizeof( Age ) : %d\n", sizeof(Age) );

printf( "Age.age : %d\n", Age.age );

Age.age = 7;

printf( "Age.age : %d\n", Age.age );

Age.age = 8;
printf( "Age.age : %d\n", Age.age );

return 0;

When the above code is compiled it will compile with a warning and when
executed, it produces the following result −
Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0

You might also like