ANSWERS TO EXERCISES ON POINTERS 1. None. Some people prefer A to indicate that *x is an int; thus x is a pointer to an int. Others prefer B to indicate that x is the variable being declared. Not many people use C; it was just included to demonstrate that the position of the * is irrelevant. 2. x = 5, y = 10. The function has no effect since integers are passed by value. Variables a and b contain only local copies of the integers 5 and 10. 3. x = 10, y = 5. Since the memory addresses of x and y are passed, the function is able to correctly swap their values. 4. x = {0, 4, 2, 3, 1}. The memory address of the 0th array element of a is passed to the function. 5. x = {0, 4, 2, 3, 1}. Address arithmetic says that a+1 is the memory address of the 1st array element and a+4 is a pointer to the 4th. 6. 0 1 2 Same as print3(a). 2 3 4 Same as print3(a+2). Just like array starts at element 2. 4 ? ? Out of bounds access. 7. Efficiency. Arrays can have billions of elements. The overhead of copying them each time you call a function would be overwhelming. It also means that you can pass a "sub-array" to a function for processing as in the previous question. 8. None. It is a matter of style. Beginners usually prefer the first. 9. scanf() needs to change the value of n. A function cannot change the value of an integer unless it knows its memory address. Instead of passing the current value of n, we use &n to pass its memory address.