3.7 - User Defined Datatypes.
UDDs – Structures
- Sometimes it becomes tough to build a whole software that works only with integers, floating values, and characters.
- In circumstances such as these, you can create your own data types which are based on the standard ones
- There are some mechanisms for doing this in C:
- Structures
- Unions
- Typedef
- Enums
- Composite (or compound) data type :
- Any data type which can be constructed from primitive data types and other composite types
- It is sometimes called a structure or aggregate data type
- Primitives types – int, char, float, double
struct Student
{
int id;
char name[30];
char address[150];
};
int main()
{
struct Student s1 = {10, “Tingu”, “Bangalore”};
printf(“Struture starts at %p\n”, &s1);
printf(“Member id is at %p\n”, &s1.id);
printf(“Member name is at %p\n”, s1.name);
printf(“Member address is at %p\n”, s1.address);
return 0;
}
Structures - Functions
- The structures can be passed as parameter and can be returned from a function
- This happens just like normal datatypes.
- The parameter passing can have two methods again a normal
- Pass by value
- Pass by reference
Example:
struct Student
{
int id;
char name[30];
char address[150];
};
void data(struct Student s)
{
s.id = 10;
}
int main()
{
struct Student s1;
data(s1);
return 0;
}
Structures – Functions – Pass by Reference "Recommended on larger structures"
Example
struct Student
{
int id;
char name[30];
char address[150]
};
void data(struct Student *s)
{
s->id = 10;
}
int main()
{
struct Student s1;
data(&s1);
return 0;
}
Data Alignment
- A way the data is arranged and accessed in computer memory
- When a modern computer reads from or writes to a memory address, it will do this in word sized chunks (4bytes in 32 bit system) or larger.
- The main idea is to increase the efficiency of the CPU, while handling the data, by arranging at a memory address equal to some multiple of the word size
- So, Data alignment is an important issue for all programmers who directly use memory.
- If
you don't understand data and its address alignment issues in your
software, the following scenarios, in increasing order of severity, are
all possible:
- – Your software will run slower.
- – Your application will lock up.
- – Your operating system will crash.
- – Your software will silently fail, yielding incorrect results.
- Fetching the character by the CPU will be like shown below
int main()
{
char ch = 'A';
int num = 0x12345678;
}
● Fetching the integer by the CPU will be like shown below..Structures – Bit Fields
- The compiler generally gives the memory allocation in multiples of bytes, like 1, 2, 4 etc.,
- What if we want to have freedom of having getting allocations in bits?!.
- This can be achieved with bit fields.
- But not that
- The minimum memory allocation for a bit field member would be a byte that can be broken in max of 8 bits
- The maximum number of bits assigned to a member would depend on the length modifier
- The default size is equal to word size
Example
struct Nibble
{
unsigned char upper : 4;
unsigned char lower : 4;
};
- The above structure divides a char into two nibbles
- We can access these nibbles independently
UDDs – Unions
- Like structures, unions may have different members with different data types.
- The major difference is, the structure members get different memory allocation, and in case of unions there will be single memory allocation for the biggest data type
Example
union DummyVar
{
char option;
int id;
double height;
};
- The above union will get the size allocated for the type double
- The size of the union will be 8 bytes.
- All members will be using the same space when accessed
- The value the union contain would be the latest update
- So as summary a single variable can store different type of data as required
UDTs - Typedefs
- Typedef is used to create a new name to the existing types.
- K&R states that there are two reasons for using a typedef.
- It provides a means to make a program more portable. Instead of having to change a type everywhere it appears throughout the program's source files, only a single typedef statement needs to be changed
- Second, a typedef can make a complex definition or declaration easier to understand.
UDTs – Enums
- Set of named integral values
- The above example has two members with its values starting from 0. i.e, e_false = 0 and e_true = 1.
- The member values can be explicitly initialized
- The is no constraint in values, it can be in any order and same values can be repeated
- Enums does not have name space of its own, so we cannot have same name used again in the same scope.
Examples
enum Boolean
{
e_false,
e_true
};
typedef enum
{
e_red = 1,
e_blue = 4,
e_green
} Color;
typedef enum
{
red,
blue
} Color;
int blue;
...






Post a Comment