v is equal to zero now. However, each variable, apart from value, also has its address (or, simply put, where it is located in the memory). The address can be retrieved by putting an ampersand (&) before the variable name.

If you print the address of a variable on the screen, it will look like a totally random number (moreover, it can be different from run to run). Let’s try this in practice with pointer in C example

The output of this program is -480613588. Now, what is a pointer? Instead of storing a value, a pointer will y store the address of a variable. Int *y = &v;

Declaring a Pointer

Like variables, pointers in C programming have to be declared before they can be used in your program. Pointers can be named anything you want as long as they obey C’s naming rules. A pointer declaration has the following form. Here,

data_type is the pointer’s base type of C’s variable types and indicates the type of the variable that the pointer points to. The asterisk (*: the same asterisk used for multiplication) which is indirection operator, declares a pointer.

Let’s see some valid pointer declarations in this C pointers tutorial:

Initialize a pointer

After declaring a pointer, we initialize it like standard variables with a variable address. If pointers in C programming are not uninitialized and used in the program, the results are unpredictable and potentially disastrous. To get the address of a variable, we use the ampersand (&)operator, placed before the name of a variable whose address we need. Pointer initialization is done with the following syntax. Pointer Syntax A simple program for pointer illustration is given below: Output:

Direct and Indirect Access Pointers

In C, there are two equivalent ways to access and manipulate a variable content

Declaration of a pointer Returns the value of the referenced variable

Returns the address of a variable

Null Pointer

We can create a null pointer by assigning null value during the pointer declaration. This method is useful when you do not have any address assigned to the pointer. A null pointer always contains value 0. Following program illustrates the use of a null pointer: Output:

Void Pointer

In C programming, a void pointer is also called as a generic pointer. It does not have any standard data type. A void pointer is created by using the keyword void. It can be used to store an address of any variable. Following program illustrates the use of a void pointer: Output:

Wild pointer

A pointer is said to be a wild pointer if it is not being initialized to anything. These types of C pointers are not efficient because they may point to some unknown memory location which may cause problems in our program and it may lead to crashing of the program. One should always be careful while working with wild pointers. Following program illustrates the use of wild pointer: Output: Other types of pointers in ‘c’ are as follows:

Dangling pointer Complex pointer Near pointer Far pointer Huge pointer

Direct access: we use directly the variable name Indirect access: we use a pointer to the variable

Let’s understand this with the help of program below After compiling the program without any errors, the result is:

Pointer Arithmetic in C

The pointer operations are summarized in the following figure

Priority operation (precedence)

When working with C pointers, we must observe the following priority rules:

The operators * and & have the same priority as the unary operators (the negation!, the incrementation++, decrement–). In the same expression, the unary operators *, &,!, ++, – are evaluated from right to left.

If a P pointer points to an X variable, then * P can be used wherever X can be written. The following expressions are equivalent: In the latter case, parentheses are needed: as the unary operators * and ++ are evaluated from right to left, without the parentheses the pointer P would be incremented, not the object on which P points. int *P = &Y; For the above code, below expressions are true *P=*P+10 *P+=2 ++*P (*P)++ X=X+10 X+=2 ++X X++ Below table shows the arithmetic and basic operation that can be used when dealing with C pointers

C Pointers & Arrays with Examples

Traditionally, we access the array elements using its index, but this method can be eliminated by using pointers. Pointers make it easy to access each array element. Output: Adding a particular number to a pointer will move the pointer location to the value obtained by an addition operation. Suppose p is a pointer that currently points to the memory location 0 if we perform following addition operation, p+1 then it will execute in this manner: Since p currently points to the location 0 after adding 1, the value will become 1, and hence the pointer will point to the memory location 1.

C Pointers and Strings with Examples

A string is an array of char objects, ending with a null character ‘\ 0’. We can manipulate strings using pointers. This pointer in C example explains this section Output: Another way to deal strings is with an array of pointers like in the following program: Output:

Disadvantages of Pointers in C

Pointers are a little complex to understand. Pointers can lead to various errors such as segmentation faults or can access a memory location which is not required at all. If an incorrect value is provided to a pointer, it may cause memory corruption. Pointers are also responsible for memory leakage. Pointers are comparatively slower than that of the variables. Programmers find it very difficult to work with the pointers; therefore it is programmer’s responsibility to manipulate a pointer carefully.

Summary:

A pointer is nothing but a memory location where data is stored. A pointer is used to access the memory location. There are various types of pointers such as a null pointer, wild pointer, void pointer and other types of pointers. Pointers can be used with array and string to access elements more efficiently. We can create function pointers to invoke a function dynamically. Arithmetic operations can be done on a pointer which is known as pointer arithmetic. Pointers can also point to function which make it easy to call different functions in the case of defining an array of pointers. When you want to deal different variable data type, you can use a typecast void pointer.