Unit 2
Unit 2
1.1 INTRODUCTION
Structures, unions and enumerations are known as user defined data types.
These data types are used to create a flexible new data type.
Structure can be used for the storage of different data types. The similarity
between structure and array is both contain a finite number of elements.
Union is similar to structures in all aspects except the manner in which their
constituent elements are stored.
In structures, separate memory is allocated to each element, while in unions all
the elements are share the same memory.
Enumeration helps to define a data type whose objects can take a limited set of
values.
1.2 STRUCTURE
Definition
A Structure is a collection of variables of different data types under a single name
and provides a convenient way of grouping several of related information
together.
Unlike arrays, it can be used for the storage of heterogeneous data (data of
different data types).
struct book
{
char author[40];
float price;
int page;
}b1,b2;
printf("\nDisplaying Information\n");
printf("Name: %s\n",s.name);
printf("Roll: %d\n",s.roll);
printf("Marks: %.2f\n",s.marks);
return 0;
}
OUTPUT
Enter the Information of the Student:
Enter the name: Sheela
Enter the roll no:123
Enter the mark:78
Displaying Information
Name:Sheela
Roll no:123
Marks:78
d) Size of a structure.
When the sizeof operator is applied to an operand of a structure type it will produce
the result as how much memory space is occupied by that particular object.
Syntax: sizeof
(expression); sizeof type
Example:
sizeof (struct book); // use structure‟s name sizeof
b1 // use variable
Program 2.5
#include<stdio.h>
struct book //structure type declaration
{
char a; // elements are declared
int b; char c; float d;
}; //structure type declarations are terminated
void main()
{
struct book var; //variable declaratio
printf(“obj of struct book will take %d bytes\n”,sizeof(struct book));
printf(“structure variable var takes %d bytes\n”, sizeof var);
}
OUTPUT
obj of struct pad will take 8 bytes
structure variable var takes 8 bytes
1.3 UNION
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. Unions provide an efficient way of using the same
memory location for multiple-purpose.
Union is a user-defined data type, but unlike structures, they share the same
memory location.
Defining a Union
To define a union, you must use the union statement in the same way as 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.
Example Program 2.9 Illustration of Union
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
void 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, "Charulatha publication");
printf( "data.str : %s \n", data.str);
}
OUTPUT
data.i : 10
data.f : 220.500000
data.str : Charulatha publication
Difference between Structure and Union
Sl.No Structure Union
1 The member of a structure occupies The member of union share same
its own memory space. memory space.
2 The keyword struct is used to define The keyword union is used to define a
a structure structure
3 All the members of a structure can Only the first member of a union can
be initialized. be initialized.
4 In structure, each member is stored In union, all memb ers are stored in
in a separate memory location. So the same memory locations. So, need
need more memory space. less memory space.
1.4 POINTERS
1.4.1 Pointers to Variables
A pointer is a variable that stores an address of another variable of same type.
Pointer can have any name that is legal for other variable.
Pointer variables are declared with prefix of „*‟ operator.
Using a pointer variable, we can access the value of another variable assigned to
it.
Syntax
data_type *pointer_name;
Example
int *a;
Example
variable *a can store the address of any integer type variable.
A pointer is a variable whose value is also an address.
Each variable has two attributes
Value
Address
We can define pointers in two ways.
i) First a pointer is a variable and assigns different values to a pointer variable.
ii) Second the value contained by a pointer must be an address w hich indicates the
location of another variable in the memory. So, pointer is called as “address
variable”.
int a=50;
int *ptr;
ptr=&a;
Here „a‟ is a variable holds a value 50 and stored in a memory location 1001.
„*ptr‟ is pointer variable holds a address of a variable „a‟.
Advantages of Using Pointers
Pointers are more compact and efficient code.
Pointers can be used to achieve clarity and simplicity.
Pointers are used to pass information between function and its reference point.
A pointer provides a way to return multiple data items from a function using its
function arguments.
Pointers also provide an alternate way to access an array element.
A pointer enables us to access the memory directly.
Example Program 2.10
/*C program for printing value and address of a variable using pointer variable*/
#include<stdio.h>
#include<conio.h>
void main()
{
int i=3;
int *ptr;
ptr=&i;
clrscr();
printf(“Address of i=%u\n”,ptr);
printf(“value of i=%d\n”,*ptr);
getch();
}
Output:
Address of i=65524
value of i=3
OUTPUT
Enter two integers 2 3
sum=5
1.4.2 Pointer operators
a) Referencing a pointer
A pointer variable is made to refer to an object.
Reference operator(&) is used for this.
Reference operator is also known as address of (&) operator.
Example
float a=12.5; float
*p;
p=&a;
b) Dereferencing a pointer
• The object referenced by a pointer can be indirectly accessed by
dereferencing the pointer.
• Dereferencing operator (*) is used for this.
• This operator is also known as indirection operator or value- at-operator.
Example program 2.13
#include<stdio.h>
void main()
{
int a=12;
int *p;
int **pptr;
p=&a;
pptr=&p;
printf(“Value=%d”,a);
printf(“value by dereferencing p is %d \n”,*p);
printf(“value by dereferencing pptr is %d \n”,**pptr);
printf(“value of p is %u \n”,p);
printf(“value of pptr is %u\n”,pptr);
}
Output
Value=12 value by
dereferencing p is 12 value by
dereferencing pptr is 12 value
of p is 1000 value of pptr is
2000
1.4.3 Arrays and pointers
Array elements are always stored in consecutive memory locations according to
the size of the array.
The size of the variable with the pointer variables refers to, depends on the data
type pointed by the pointer.
A pointer when incremented, always points to a location after skipping the number
of bytes required for the data type pointed to by it. Example
int a[5]={10,20,30,40,50};
a[5] means the array „a‟ has 5 elements and of integer data type
Program 2.14
/*C program to print the value and address of an array elements*/
#include<stdio.h>
#include<conio.h>
void main()
{
int a[5]={10,20,30,40,50};
int i;
clrscr();
for(i=0;i<5;i++)
{
printf(“The value of a[%d]=%d\n”,i,a[i]);
printf(“Address of a[%d]=%u\n”,i,&a[i]);
} getch();
}
Output
The value of a[0]=10
Address of a[0]=4000
The value of a[1]=20
Address of a[1]=4002
The value of a[2]=10
Address of a[2]=4004
The value of a[3]=10
Address of a[3]=4006
Example Program 2.15
Program to print the value and address of elements of an array using pointer
notation
#include<stdio.h>
int main( )
{
int arr[5];
int i;
printf("Enter the array 5 elements : ");
for(i=0; i<5; i++)
{
scanf("%d", &arr[i]);
}
printf("\nArray elements with their addresses using pointers : \n");
return 0;
}
OUTPUT
Enter the array 5 elements :
6
2
9
1
7
ptr=ptr+1;
}
printf(“Total=%d”,sum);
}
Output
Enter the number
10
20
30
40
50
Total= 150
#include<stdio.h>
#include<conio.h>
void main()
{
int * int *a[3];
int b=10,c=20,d=30,i;
a[0]=&b; a[1]=&c; a[2]=&d;
clrscr();
for(i=0;i<3;i++)
{
printf(“Address=%u\n”,a[i]);
printf(“Value=%d\n”,*(a[i]));
}
getch();
}
Output
Address=4000
Value=10
Address=5000
Value=20
Address=6000
Value=30
The address of num1 and num2 are passed to the swap() function using
swap(&num1, &num2);
When *n1 and *n2 are changed inside the swap() function, num1 and num2
inside the main() function are also changed.
Inside the swap() function, *n1 and *n2 swapped. Hence, num1 and num2 are
also swapped.
Example
• Below is an example of an enum named cars and how you can change the default
values.
enum cars{BMW, Ferrari, Jeep, Mercedes-Benz}; o
Here, the default values for the constants are:
BMW=0, Ferrari=1, Jeep=2, and Mercedes-Benz=3. However, to change
the default values, you can define the enum as follows:
enum cars{
BMW=3,
Ferrari=5,
Jeep=0,
Mercedes-Benz=1
};
int main()
{
// printing the values of weekdays
for(int i=Sunday;i<=Saturday;i++)
{
printf("%d, ",i);
}
return 0;
}
Output
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. }
{
fread(&num, sizeof(struct threeNum), 1, fptr);
printf(“n1: %d\tn2: %d\tn3: %d”, num.n1, num.n2, num.n3);
}
fclose(fptr);
return 0;
}
TEXT FILE
This program will start reading the records from the file program.bin in the
reverse order (last to first)
In C, all components are files, each with a different behavior based on the
attached devices. To enable the I/O functions, se veral standard built-in functions
were created and stored in libraries.
Some of the high level file I/O functions are given in Table 2 .1
Table 2.1 High level file I/O functions
S.No Function Description
1 fopen() opens new or existing file
2 fprintf() write data into the file
3 fscanf() reads data from the file
4 fputc() writes a character into the file
5 fgetc() reads a character from file
6 fclose() closes the file
7 fseek() sets the file pointer to given position
8 fputw() writes an integer to file
9 fgetw() reads an integer from file
10 ftell() returns current position
11 rewind() sets the file pointer to the beginning of the file
1. fopen () : It creates a new file for use or opens an existing file for use.
2. fclose (): It closes a file which has been opened for use.
3. fscanf( file pointer, format string, address of the variable)
Example: fscanf(fptr,”%d”, &num);
4. fprintf(console output, “format string”, file pointer);
Example: fprintf(stdout, “%f \n”, f); /*note: stdout refers to screen */
5. getw (): This function returns the integer value from a given file and increment the
file pointer position to the next message.
Syntax: getw (fptr);
Where fptr is a file pointer which takes the integer value from file.
6. putw (): This function is used for writing an integer value to a given file. Syntax:
putw (value,fptr);
Where fptr is a file pointer Value is an integer value which is written to a given file.
Example Program for getw() and putw()
Program 2.24: Write a program to read integer data from the user and write it into
the file using putw() and read the same integer data from the file using getw() and
display it on the output screen.
#include<stdio.h>
#include<conio.h>
void main()
{
FILE *fp;
int n; clrscr();
fp=fopen(“c.dat”, “wb+”);
printf(“Enter the integer
data”); scanf(“%d”,&n);
while(n!=0)
{ putw(n,fp);
scanf(“%d”,&n);
}
rewind(fp);
printf(“Reading data from file”);
while((n=getw(fp))!=EOF)
{
printf(“%d\n”,n);
}
fclose(fp);
getch();
}
7. fwrite()
This function is used for writing an entire block to a given file.
Syntax:
fwrite(ptr,size,nst,fptr);
ptr is a pointer ,it points to the array of structure. Size is the size of
the structure nst is the number of the structure fptr is a filepointer.
8. fread()
fread(ptr,size,position,fptr);similar to fwrite
9. fflush(stdin);To clean the input stream
Program 2.25: program for fwrite():
Write a program to read an employee details and write them into the file at a time
using fwrite().
#include<stdio.h>
#include<conio.h>
void main()
{
struct emp
{
int eno;
char ename[20];
float sal;
}e;
FILE *fp;
fp=fopen(“emp.dat”, “wb”);
clrscr();
printf(“Enter employee number”);
scanf(“&d”,&e.eno);
printf(“Enter employee name”);
fflush(stdin);
scanf(“%s”,e.ename);
printf(“Enter employee salary”);
scanf(“%f”,&e.sal); fwrite(&e,sizeof(e),1,fp);
printf(“One record stored successfully”);
getch();
}
Operations for Search data in a file
1. fseek()
2. ftell()
3. rewind()
When many records inside a file and need to access a record at a specific position, you
need to loop through all the records before it to get the record. This will waste a lot of
memory and operation time. An easier way to get to the required data can be achieved
using fseek().
Syntax of fseek()
fseek(FILE * stream, long int offset, int whence)
fseek(file pointer, displacement, pointer position);
The first parameter stream is the pointer to the file. The second parameter is the
position of the record to be found, and the third parameter specifies the location
where the offset starts.
This function is used for seeking the pointer position in the file at the specified
byte.
Syntax: fseek( file pointer, displacement, pointer position);
file pointer - It is the pointer which points to the file.
displacement -It is positive or negative.
This is the number of bytes which are skipped backward (if negative) or forward
(if positive) from the current position. This is attached with L because this is a
long integer.
Pointer position: This sets the pointer position in the file.
2. fseek( p,5L,1)
This 1 means current position of the pointer position. From this statement pointer
position is skipped 5 bytes forward from the current position.
3. fseek(p,-5L,1):
From this statement pointer position is skipped 5 bytes backward from the current
position.
Program 2.26: for fseek()
#include <stdio.h>
struct threeNum
{
int n1, n2, n3;
};
int main()
{
int n;
struct threeNum num;
FILE *fptr;
if ((fptr = fopen(“C:\\program.bin”,”rb”)) == NULL){
printf(“Error! opening file”);
// Program exits if the file pointer returns NULL.
exit(1);
}
// Moves the cursor to the end of the file
fseek(fptr, sizeof(struct threeNum), SEEK_END);
for(n = 1; n < 5; ++n)
{
fread(&num, sizeof(struct threeNum), 1,fptr);
printf(“n1: %d\tn2: %d\tn3: %d”, num.n1, num.n2, num.n3);
}
fclose(fptr);
return 0;
}
ftell()
This function is used to move the file pointer to the beginning of the given file. This
function returns the value of the current pointer position in the file. The value is
count from the beginning of the file.
Syntax: ftell(fptr); fptr is a file pointer. rewind()
Syntax: rewind( fptr); fptr is a file pointer.
Program 2.27: program for fseek():
Write a program to read last ‘n’ characters of the file using appropriate file
functions(Here we need fseek() and fgetc()).
#include<stdio.h>
#include<conio.h>
void main()
{
FILE *fp; char ch;
clrscr();
fp=fopen(“file1.c”,“r”);
if(fp==NULL)
printf(“file cannot be opened”);
else {
printf(“Enter value of n to read last „n‟ characters”);
scanf(“%d”,&n); fseek(fp,-n,2);
while((ch=fgetc(fp))!=EOF)
{
printf(“%c\t”,ch);
}
}
fclose(fp);
getch();
}
All preprocessor directives starts with hash # symbol Let's see a list of
preprocessor directives.
#define: It substitutes a preprocessor using macro.
#include: It helps to insert a certain header from another file.
#undef: It undefines a certain preprocessor macro.
#ifdef: It returns true if a certain macro is defined.
#ifndef: It returns true if a certain macro is not defined.
• #if, #elif, #else, and #endif: It tests the program using a certain condition; these
directives can be nested too.
• #line: It handles the line numbers on the errors and warnings. It can be used
to change the line number and source files while generating output during
compile time.
• #error and #warning: It can be used for generating errors and warnings.
• #error can be performed to stop compilation.
• #warning is performed to continue compilation with messages in the console
window.
• #region and #endregion: To define the sections of the code to make them more
understandable and readable, we can use the region using expansion and
collapse features.