• Famous interview questions


    Question 1:Difference between const char* p and char const* p?

    In const char* p, the character pointed by ‘p’ is constant, so u cant
    change the value of character pointed by p but u can make ‘p’ refer to
    some other location.
    in char const* p, the ptr ‘p’ is constant not the character referenced by
    it, so u cant make ‘p’ to reference to any other location but u can
    change the value of the char pointed by ‘p’.

    Question 2: What is hashing?
    To hash means to grind up, and that’s essentially what hashing is all
    about. The heart of a hashing algorithm is a hash function that takes
    your nice, neat data and grinds it into some random-looking integer.
    The idea behind hashing is that some data either has no inherent
    ordering (such as images) or is expensive to compare (such as
    images). If the data has no inherent ordering, you can’t perform
    comparison searches.
    If the data is expensive to compare, the number of comparisons used
    even by a binary search might be too many. So instead of looking at
    the data themselves, you’ll condense (hash) the data to an integer (its
    hash value) and keep all the data with the same hash value in the
    same place. This task is carried out by using the hash value as an
    index into an array.
    To search for an item, you simply hash it and look at all the data whose
    hash values match that of the data you’re looking for. This technique
    greatly lessens the number of items you have to look at. If the
    parameters are set up with care and enough storage is available for
    the hash table, the number of comparisons needed to find an item can
    be made arbitrarily close to one.
    One aspect that affects the efficiency of a hashing implementation is
    the hash function itself. It should ideally distribute data randomly
    throughout the entire hash table, to reduce the likelihood of collisions.
    Collisions occur when two different keys have the same hash value.
    There are two ways to resolve this problem. In open addressing, the
    collision is resolved by the choosing of another position in the hash
    table for the element inserted later. When the hash table is searched, if
    the entry is not found at its hashed position in the table, the search
    continues checking until either the element is found or an empty
    position in the table is found.
    The second method of resolving a hash collision is called chaining. In
    this method, a bucket or linked list holds all the elements whose keys
    hash to the same value. When the hash table is searched, the list must
    be searched linearly
    .
    Question:3 How can you determine the size of an allocated portion of memory?
    You can’t, really. free() can , but there’s no way for your program to
    know the trick free() uses. Even if you disassemble the library and
    discover the trick, there’s no guarantee the trick won’t change with the
    next release of the compiler.

    Question 4: Can static variables be declared in a header file?
    You can’t declare a static variable without defining it as well (this is
    because the storage class modifiers static and extern are mutually
    exclusive). A static variable can be defined in a header file, but this
    would cause each source file that included the header file to have its
    own private copy of the variable, which is probably not what was
    intended.

    Question 5: Can a variable be both const and volatile?
    Yes. The const modifier means that this code cannot change the value
    of the variable, but that does not mean that the value cannot be
    changed by means outside this code. 

    Question 6: Can include files be nested?
    Yes. Include files can be nested any number of times. As long as you
    use precautionary measures , you can avoid including the same file
    twice. In the past, nesting header files was seen as bad programming
    practice, because it complicates the dependency tracking function of
    the MAKE program and thus slows down compilation. Many of today’s
    popular compilers make up for this difficulty by implementing a
    concept called precompiled headers, in which all headers and
    associated dependencies are stored in a precompiled state.
    Many programmers like to create a custom header file that has
    #include statements for every header needed for each module. This is
    perfectly acceptable and can help avoid potential problems relating to
    #include files, such as accidentally omitting an #include file in a
    module.
    Question 7: When does the compiler not implicitly generate the address of the first
    element of an array?
    Whenever an array name appears in an expression such as
    - array as an operand of the sizeof operator
    - array as an operand of & operator
    - array as a string literal initializer for a character array
    Then the compiler does not implicitly generate the address of the
    address of the first element of an array.

    Question 9: What is a null pointer?
    There are times when it’s necessary to have a pointer that doesn’t
    point to anything. The macro NULL, defined in , has a value that’s
    guaranteed to be different from any valid pointer. NULL is a literal zero,
    possibly cast to void* or char*. Some people, notably C++
    programmers, prefer to use 0 rather than NULL.
    The null pointer is used in three ways:
    1) To stop indirection in a recursive data structure
    2) As an error value
    3) As a sentinel value
    Question 10: What is the difference between text and binary modes?
    Streams can be classified into two types: text streams and binary
    streams. Text streams are interpreted, with a maximum length of 255
    characters. With text streams, carriage return/line feed combinations
    are translated to the newline n character and vice versa. Binary
    streams are uninterrupted and are treated one byte at a time with no
    translation of characters. Typically, a text stream would be used for
    reading and writing standard text files, printing output to the screen or
    printer, or receiving input from the keyboard.
    A binary text stream would typically be used for reading and writing
    binary files such as graphics or word processing documents, reading
    mouse input, or reading and writing to the modem.

    Question 11: What is static memory allocation and dynamic memory allocation?
    Static memory allocation: The compiler allocates the required memory
    space for a declared variable.By using the address of operator,the
    reserved address is obtained and this address may be assigned to a
    pointer variable.Since most of the declared variable have static
    memory,this way of assigning pointer value to a pointer variable is
    known as static memory allocation. memory is assigned during
    compilation time.
    Dynamic memory allocation: It uses functions such as malloc( ) or
    calloc( ) to get memory dynamically.If these functions are used to get
    memory dynamically and the values returned by these functions are
    assingned to pointer variables, such assignments are known as
    dynamic memory allocation.memory is assined during run time.

    When should a far pointer be used?
    Sometimes you can get away with using a small memory model in
    most of a given program. There might be just a few things that don’t fit
    in your small data and code segments. When that happens, you can
    use explicit far pointers and function declarations to get at the rest of
    memory. A far function can be outside the 64KB segment most
    functions are shoehorned into for a small-code model. (Often, libraries
    are declared explicitly far, so they’ll work no matter what code model
    the program uses.) A far pointer can refer to information outside the
    64KB data segment. Typically, such pointers are used with farmalloc()
    and such, to manage a heap separate from where all the rest of the
    data lives. If you use a small-data, large-code model, you should
    explicitly make your function pointers far.

    Question 12: How are pointer variables initialized?
    Pointer variable are initialized by one of the following two ways
    - Static memory allocation
    - Dynamic memory allocation

    Question 13: Difference between arrays and pointers?
    - Pointers are used to manipulate data using the address. Pointers use
    * operator to access the data pointed to by them
    - Arrays use subscripted variables to access and manipulate data.
    Array variables can be equivalently written using pointer expression.

    Question 14: Is using exit() the same as using return?
    No. The exit() function is used to exit your program and return control
    to the operating system. The return statement is used to return from a
    function and return control to the calling function. If you issue a return
    from the main() function, you are essentially returning control to the
    calling function, which is the operating system. In this case, the return
    statement and exit() function are similar.

    Question 15: How many levels deep can include files be nested?
    Even though there is no limit to the number of levels of nested include
    files you can have, your compiler might run out of stack space while
    trying to include an inordinately high number of files. This number
    varies according to your hardware configuration and possibly your
    compiler.

    Question 16: What is the difference between declaring a variable and defining a variable?
    Declaring a variable means describing its type to the compiler but not
    allocating any space for it. Defining a variable means declaring it and
    also allocating space to hold the variable. You can also initialize a
    variable at the time it is defined.
    Question17: What is an lvalue?
    An lvalue is an expression to which a value can be assigned. The lvalue
    expression is located on the left side of an assignment statement,
    whereas an rvalue is located on the right side of an assignment
    statement. Each assignment statement must have an lvalue and an
    rvalue. The lvalue expression must reference a storable variable in
    memory. It cannot be a constant.

    Question 18: Differentiate between an internal static and external static variable?
    An internal static variable is declared inside a block with static storage
    class whereas an external static variable is declared outside all the
    blocks in a file.An internal static variable has persistent storage,block
    scope and no linkage.An external static variable has permanent
    storage,file scope and internal linkage.

    Question 19: What is the difference between a string and an array?

    An array is an array of anything. A string is a specific kind of an array
    with a well-known convention to determine its length.
    There are two kinds of programming languages: those in which a string
    is just an array of characters, and those in which it’s a special type. In
    C, a string is just an array of characters (type char), with one wrinkle: a
    C string always ends with a NUL character.
    The “value” of an array is the same as the address of (or a pointer to)
    the first element; so, frequently, a C string and a pointer to char are
    used to mean the same thing.
    An array can be any length. If it’s passed to a function, there’s no way
    the function can tell how long the array is supposed to be, unless some
    convention is used. The convention for strings is NUL termination; the
    last character is an ASCII NUL (‘’) character.

    Question 20: What are advantages and disadvantages of external storage class?
    Advantages of external storage class
    1)Persistent storage of a variable retains the latest value
    2)The value is globally available
    Disadvantages of external storage class
    1)The storage for an external variable exists even when the variable is
    not needed
    2)The side effect may produce surprising output
    3)Modification of the program is difficult
    4)Generality of a program is affected

2 comments:

  1. Anonymous said...

    there is no difference between const char *p and char const *p;
    Looks like you wanted to ask the difference between
    const char *p and char *const p;

  2. Anonymous said...

    Yes, there is no difference between const char *p and char const *p;.
    Please change your question .

Post a Comment