C Lang
C Lang
C Lang
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.
String-grouping of characters
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.
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;
#include <stdio.h>
// declare a pointer
int *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[]){
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.
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 ];
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 −
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 i,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 −
1 Multi-dimensional arrays
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];
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
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.
#include <stdio.h>
int main () {
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 () {
return 0;
When the above code is compiled and executed, it produces the following
result −
The value of ptr is 0
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 −
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.
If you follow the rule of array initialization then you can write the above
statement as follows −
char greeting[] = "Hello";
#include <stdio.h>
int main () {
return 0;
When the above code is compiled and executed, it produces the following
result −
Greeting message: Hello
1 strcpy(s1, s2);
2 strcat(s1, s2);
3 strlen(s1);
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);
6 strstr(s1, s2);
#include <stdio.h>
#include <string.h>
int main () {
char str3[12];
int len ;
strcpy(str3, str1);
len = strlen(str1);
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;
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
#include <stdio.h>
#include <string.h>
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( ) {
/* book 1 specification */
Book1.book_id = 6495407;
/* book 2 specification */
Book2.book_id = 6495700;
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
#include <stdio.h>
#include <string.h>
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
/* function declaration */
int main( ) {
/* book 1 specification */
Book1.book_id = 6495407;
/* book 2 specification */
Book2.book_id = 6495700;
printBook( Book1 );
printBook( Book2 );
return 0;
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;
#include <stdio.h>
#include <string.h>
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
/* function declaration */
int main( ) {
/* book 1 specification */
Book1.book_id = 6495407;
/* book 2 specification */
strcpy( Book2.title, "Telecom Billing");
Book2.book_id = 6495700;
printBook( &Book1 );
printBook( &Book2 );
return 0;
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.
struct packed_struct {
} pack;
Here, the packed_struct contains 6 members: Four 1 bit flags f1..f3, a 4-bit
type and a 9-bit my_int.
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 −
member definition;
member definition;
...
member definition;
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;
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( ) {
return 0;
When the above code is compiled and executed, it produces the following
result −
Memory size occupied by data : 20
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main( ) {
data.i = 10;
data.f = 220.5;
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( ) {
data.i = 10;
data.f = 220.5;
printf( "data.f : %f\n", data.f);
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.
struct {
} 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 {
} 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>
struct {
} status1;
struct {
} status2;
int main( ) {
printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
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
struct {
};
1 type
2 member_name
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 {
} 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 {
} Age;
int main( ) {
Age.age = 4;
Age.age = 7;
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