"Every array symbol is actually a pointer, so you can do both a[i] and *(a+i)"

"A string is the string of characters between the pointer and the '\0'"

There is always this occupying debate about what constitutes computer science. Alongside is usually a prescription for the students of the discpline: "If you don't know X, you can't call yourself a programmer". Joel Spolksy is the latest entrant with his need-to-know-list : recursion and ... pointers.Yeah, you heard that right. Weird as it seems, Joel considers pointers as a first-class concept in computer science and something that gives you a deep insight into programming techniques. The list that I am familiar with (and agree with) is recursion and abstraction. These two concepts seem to be the core constructs of the way we organize instructions for the computer. Recursion allows the programmer to define a task in terms of itself only with a decreasing amount of input. Iteration, which is recursion turned inside out, is what enables us to instruct the computer once and ask it to keep repeating itself. Abstraction, on the other hand allows us to build a virtual machine by adjusting the view of the computer as seen by the user. This is the basis of UI design, programming language constructs, object-oriented programming, functional programming and almost any clever idea in computer science.But pointers..? Those unassuming memory location references? What concepts do they hold or represent? Why would anyone claim that you had to know pointers to be worth your salt, when there's so little to learn about them. Even as I had these questions, I realized what Joel was getting at when I looked at the "Test Yourself" examples which required pointer manipulation. What Joel was actually talking about was the C tricks involved in pointer manipulationorBut these are merely constructs in the C language and are (atleast in the opinions of some people) just needlessly kludgy. They do not demonstrate any first-class concepts that can be described independant of a computer and the way memory is usually organized etc. Compare this to a lisp concept like closure which can be explained in terms of mathematical concepts. These do not stretch the student's mind anymore than a database concept like join or referential integrity does ("Imagine that the foreign key value actually points to the primary table") and are only as difficult to master. Pointer is just an abstraction introduced in a language to make memory-management more controlled by the programmer.So it is not sufficient for a computer science student to understand one abstraction, namely the pointer. They need to study the way abstractions work and become proficient in creating them, not just working with one. In some cases, programmers are impaired without the ease with which abstractions need to be dealt with. For example, conside how an XML schema (which describes the structure of an XML document) can itself be expressed in XML, called XSD. Now, since the schema is an XML document, its structure should be described in yet another schema. The beauty of this Moebius strip lies in abstraction concepts. One more for the road: In the Smalltalk language, everything is an Object (even the Compiler). If every Smalltalk object is of type Object, then what type is the object Object of? Think all you want, but pointers won't get you out of this one :-)