Variables are named locations in a computer's memory used to store data. The value of this variable can be changed one or more times during the execution of a program. In C, all variables and the type of values that the variable can hold must be declared before they are used and must adhere to the following rules:

  • The variable name can contain letters (a to z and A to Z), digits (0 to 9), and the underscore character ( _ )
  • The first character of the name must be a letter. or underscore. A digit cannot be used as the first character.
  • C is case-sensitive.
  • C keywords are not acceptable as variable names. A keyword is a word that is part of the C language.

Variable Declarations

A variable declaration will specify to the compiler the name and type of a variable. When a variable is declared the compiler automatically allocates memory for it and this size can vary depending on the computer platform. Any attempt to use a variable that hasn’t been declared will result in the compiler generating an error message. A variable declaration will consist of the variable type followed by the variable name. Multiple single-line variable declarations are possible by separating each variable name with a comma –

int x //declares variable of type int
float x,y,z; //declares variables of type float
short int x,y,z; //declares variables of type short int
unsigned int x,y,z; //declares variables of type unsigned int
char xyz; //declares variable of type char

Initialising Variables by Assigning Values

A variable can be assigned an initial value when created or after creation but these values must be in the correct format. In C, there are three ways to initialise a variable –

Using the assignment operator (=)

int value=10; //creates and initialises variable value of type int to 10

Using parenthesis ()

int value (20) ; //creates and initialises variable value of type int to 20

Using braces {}

int value{30} ; //creates and initialises variable value of type int to 30

An uninitialised variable is a variable that is declared but is not set to a definite known value. An uninitialised variable will have some unknown value known as a “garbage value”. This is due to the variable being assigned a memory location by the compiler and inheriting whatever value happens to be in that memory location. Using the value from an uninitialised variable can result in undefined behaviour and data corruption.

Smaller variables require less memory, and the computer can perform faster mathematical operations. In contrast, large integers and floating-point values require more storage space and thus more time for performing mathematical operations. Using the correct variable types ensures your program runs as efficiently as possible.

Variable Types

Data type Notes
char Store -127 to 127 or 0 to 255. 8 bits. Usually used for holding ASCII characters.
char16_t Unsigned integer type. Usually 16 bits. Used for UTF-16 character representation
char32_t Unsigned integer type. Usually 32-bit bits. Used for UTF-32 character representation
wchar_t Occupies between 16 or 32 bits depending on the compiler being used. Used for Unicode character representation
signed char 8 bits. Can store values between -128 to +127. Used for dealing with binary data
signed short int Usually at least 16 bits. Can store values between –32,768 to 32,767
signed int Usually at least 16 bits. Can store values between –32,768 to 32,767
signed long int Usually at least 32 bits. Can store values between –2,147,483,648 to 2,147,483,647
signed long long int usually at least 64 bits. Can store values between –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
unsigned char 8 bits. Can store values between 0 to 255
unsigned short int At least 16 bits. Can store values between 0 to 65,535
unsigned int At least 16 bits. Can store values between 0 to 65,535
unsigned long int At least 32 bits. Can store values between –2,147,483,648 to 2,147,483,647
unsigned long long int At least 64 bits. Can store values between 0 to 4,294,967,295
float Usually 32 bits. Used for storing single precision floating point values.
double Usually 64 bits. Used for storing double precision floating point values
long double Usually 96 bites. Used for storing long double-precision floating point values

Variable Scope

A scope is a region of a program, and the scope of variables refers to the area of the program where a variable exists and can be accessed after its declaration.

In C, programming variables can be declared in three places:

  • Inside a function or a code block. These are known as local variables and are only valid inside the block they are defined.
  • Outside of all functions. These are known as global variables and can be accessed in any part of the program.
  • In the function parameters (formal parameter).

When a local variable is defined, it is not initialised by the system and must be initialised by the program. Global variables are initialised automatically by the system.

Using Type Definitions

The typedef declaration provides a way to declare an identifier as an alias or shortcut for an existing variable type. When compiled, the compiler substitutes the identifier with the variable type. Typedef does not create a distinctive variable type but establishes a synonym for an existing variable type –

typedef int aliasint; //create an alias for int name aliasint
aliasint v=12; //creates int variable v and set to 12

Sizeof

The sizeof() operator returns the size in bytes of a variable or a type. Since the sizes of a variable or data types can differ between computing environments, knowing the size of a variable in all situations can be useful. The following program lists the size of the C variable types –

#include <stdio.h>
int main(void)
{
printf( "\nA char is %d bytes", sizeof( char ));
printf( "\nAn int is %d bytes", sizeof( int ));
printf( "\nA short is %d bytes", sizeof( short ));
printf( "\nA long is %d bytes", sizeof( long ));
printf( "\nA long long is %d bytes\n", sizeof( long long));
printf( "\nAn unsigned char is %d bytes", sizeof( unsigned char ));
printf("\nAn unsigned int is %d bytes", sizeof( unsigned int ));
printf("\nAn unsigned short is %d bytes", sizeof( unsigned short ));
printf("\nAn unsigned long is %d bytes", sizeof( unsigned long ));
printf("\nAn unsigned long long is %d bytes\n",sizeof( unsigned long long));
printf( "\nA float is %d bytes", sizeof( float ));
printf( "\nA double is %d bytes\n", sizeof( double ));
printf( "\nA long double is %d bytes\n", sizeof( long double ));
return 0;
}

Enumerations

An enumeration is a user-defined data type that consists of integral constants called enumerators. An enum variable takes only one value out of many prescribed values and returns a numeric value corresponding to the selected enumeration. These constants can then be used anywhere that an integer can. Enumerations are defined using the keyword enum followed by the type-name and then the variable-list.

The enumeration list is a comma-separated list of names representing the enumeration values. The variable list is optional because variables may be declared later using the enumeration type name. Although enumerated constants are automatically converted to integers, integers are not automatically converted into enumerated constants.

The following code declares an enumerator called month with the first enum variable value set to one. An enumerator variable is declared called now and set to the value jun. The value of 6 is then output to the screen.

#include <stdio.h>
enum month {Jan=1, Feb, Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec };
int main()
{
    // creating now variable of enum month type
    enum month now;
    now = Jun;
    printf("Day %d",now);
    return 0;
}

Extern

The extern keyword enables the programmer to declare a variable without defining it. In programs consisting of several files, each file must be aware of the global variables defined outside that file. The declaration informs the compiler that a variable by that name and type exists and the compiler does not need to allocate memory for it.. The syntax is –

extern int x; //declares a int x value which has been defined elsewhere