|
|||
Department of Engineering | |
University of Cambridge > Engineering Department > computing help |
aai[0][0]aai[0][1]aai[1][0]aai[1][1]
aai[2][0]aai[2][1]aai[3][0]aai[3][1]
*aai is of type int[]. Note that:-
aai[1][2] == *( (aai[1])+2) == *(*(aai+1)+2)and that numerically
aai == aai[0] == &aai[0][0]
*aai can be used as a pointer to the first element even though it is of type `array 4 of int' because it becomes `pointer to int' when used where a value is needed.
But *aai is not equivalent to a pointer. For example, you can't change its value. This distinction can easily and dangerously be blurred in multi-file situations illustrated in the following example. In
extern int *foo;foo is a variable of type pointer to int. foo's type is complete, (sizeof foo) is allowed. You can assign to foo. But given
extern int baz[];baz is a variable of type `array UNKNOWN-SIZE of int'. This is an `incomplete' type, you can't take (sizeof baz). You cannot assign to baz, and although baz will decay into a pointer in most contexts, it is not possible for (baz == NULL) ever to be true.
The compiler will allow you to mix the array/pointer notation and will get it right, but it needs to know what the reality is. Once you declare the array/pointer correctly, you can then access it either way.