Playing with Pointers

    by nikoo28

    Question: What is a Pointer? What are its limitations? What are its benefits? How do we use it? What all operation we can perform using it?

    In this article we are going to discover answers to all these questions.

    Pointer is a variable that contain the address of another variable and that variable can be a structure, array or basic data type. The basic syntax to define the pointer is as follows:
    Datatype * identifier;
    Datatype is the data type of the variable whose address we are going to store in the pointer.
    * is known as Indirection or De-referencing operator to reference the variable’s value whose address is stored with the pointer.
    identifier is the Identifier that we use for the pointer variable.
    Pointers allow us to manipulate the memory and change the actual values stored in the memory locations and they form very strong feature of C language. Whenever we define a Pointer to a datatype we say that the Pointer points to it. E.g. – int * example – pointer to integer

    Pointer and Array have a very strong relationship in C. An array sub-scripting can be done by using pointer also and the pointer version will be faster in general. So the i-th element in an array int arr[n] of size n can be accessed by *(arr + i). We are able to do so because array name is its base address in C. But there is one important difference between an array name and a pointer. A pointer is a variable, so

    ptr=arr
    

    and

    ptr++
    

    are legal, but an array name is not a variable i.e. constructions like

    arr=ptr
    

    and

    arr++
    

    are illegal, where definition of arr and ptr are: int arr[n] and int *ptr respectively.

    Operations on Pointers

    Let’s now see the valid operations with Pointers. The valid pointer operations are assignment of pointers of the same type, adding or subtracting a pointer and an integer, subtracting or comparing two pointers to members of the same array, and assigning or comparing to zero. All other pointer arithmetic is illegal. It is not legal to add two pointers, or to multiply or divide or shift or mask them, or add float or double to them, or even for valid *, to assign a pointer of one type of pointer of another type without a cast. However, if the two pointers points to members of the same array, then binary relations like == , != , < , >= works properly i.e. relational operators.
    C also defines a generic pointer, the type void * (pointer to void). It can be cast into any type of pointer and it is default return type of library function malloc(). void * cannot de-reference itself so it always needs to be converted into another type by an explicit cast. Let’s see all this aspects of pointers by the following code:

    #include<stdio.h>
    
    int main(void)
    {
    	// Declaring a void pointer
    	void *vptr;
    	
    	// Creating some pointer variables
    	int arr[5]={34,5,17,39,1};
    	int *ptr1,*ptr,num,i;
    	
    	vptr=arr;
    	
    	ptr=(int *)vptr;	//  casting void *
    	
    	ptr1=arr+3;		   // pointer and integer addition
    	
    	if(ptr1 > ptr)		     //comparison of pointers
    		num=ptr1-ptr;		// subtraction of pointers
    
    	printf("% d,% d,% d\n",*ptr,*ptr1,num);
    	
    	ptr = ptr1-2;		//pointer and integer subtraction
    	ptr1++;			    //pointer increment
    	
    	printf("% d,% d\n",*ptr,*ptr1);
    	
    	return 0;
    }
    

    Output:
    34 39 3
    5 1

    Following would be invalid operation in the above code :

    // invalid operations
    ptr1  = arr + ptr ;
    ptr1 +=ptr;
    ptr  *=3;
    ptr1 /=ptr;
    char *cptr  =ptr;
    ptr =*(arr +4.2);
    ptr <<2;
    

    You may replace these lines in above code(obviously omitting the comment characters) to check that these are invalid operations. Here is the link to the running sample of the code-

    http://ideone.com/xQfR5T

    This is a basic and introductory article on pointers meant mainly for the readers who are new or ‘not an expert’ with pointers to get an easy understanding of pointers. Pointers extend to multidimensional pointers, function pointers etc. which we will cover in further posts so keep tuned in ;-)

    0 comments
    0 FacebookTwitterLinkedinWhatsappEmail
  • Theory

    Unlocking the Enumeration/enum Mystery

    by nikoo28
    2 minutes read

    What are enums actually? Enums provide an opportunity to the user to define a shorthand for fixed set of constants like months in a year, gender etc. Enumeration is the list of constant integer values, which means that the enum values can’t be modified. Here we are going to explain Enumeration usage rules and constraints in C language. In C Enums are defined by enum keyword. The enum definition is analogous to the way a structure is defined . Syntax: enum tagname{CONST1=1,CONST2,…} enumVariable; tagname – It is the name given …

    0 FacebookTwitterLinkedinWhatsappEmail
  • Question: Given 2 sorted arrays, find the intersection elements between them. Array 1: 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26 Array 2: 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33 Output: 6, 12, 18, 24 Let’s called Array1 as “A” and Array2 as “B”, each with size m and n. The obvious brute-force solution is to scan through each element in A, and for each element in A, scan if that element exist in B. The running time complexity is O(m*n). …

    0 FacebookTwitterLinkedinWhatsappEmail
  • Arrays

    The Stock Market Problem

    by nikoo28
    3 minutes read

    Question: Let us suppose we have an array whose ith element gives the price of a share on the day i. If you were only permitted to buy one share of the stock and sell one share of the stock, design an algorithm to find the best times to buy and sell. When we talk about the best times to sell and buy, we mean that we want the best profit possible. A profit is possible when our buying rate is less than the selling rate. We need to maximize …

    0 FacebookTwitterLinkedinWhatsappEmail
  • Strings

    Longest substring without repeating characters

    by nikoo28
    3 minutes read

    Question: Given a string, find the length of the longest substring without repeating characters. Input: “abcabcbb” Output: “abc” Input: “bbbb” Output: “b” The longest substring without repeating letters for “abcabcbb” is “abc”, which the length is 3. For “bbbbb” the longest substring is “b”, with the length of 1. We definitely have the brute-force method, where we find each string and then compare. But we want to speed up the process. How can we can look up if a character had existed in the substring instantaneously? The answer is using …

    0 FacebookTwitterLinkedinWhatsappEmail
  • Misc

    Make a fair coin from a biased coin.

    by nikoo28
    2 minutes read

    Question: You are given a function foo() that represents a biased coin. When foo() is called, it returns 0 with 60% probability, and 1 with 40% probability. Write a new function that returns 0 and 1 with 50% probability each. Your function should use only foo(), no other library method. We know foo() returns 0 with 60% probability. How can we ensure that 0 and 1 are returned with 50% probability? If we can somehow get two cases with equal probability, then we are done. We call foo() two times. …

    0 FacebookTwitterLinkedinWhatsappEmail
  • Trees

    Find the left view of a binary tree.

    by nikoo28
    2 minutes read

    Question: Given the root pointer to a binary tree, find the left view of the tree. Input: Sample Tree (Pointer to node 1 is given). Output: 1, 2, 4 At a single glance of the problem, we can understand that we need to perform a level order traversal on the tree. This is similar to finding the number of levels in a tree. At the start of each level, we just print the first element. This can be done with the algorithm below:- void leftViewOfBinaryTree(struct binaryTreeNode * root) { // …

    0 FacebookTwitterLinkedinWhatsappEmail

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More