一个表达式的结果如果是一个指针,那么这个表达式就叫指针表式。
例八:
由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。
好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。在例七中,&a 不是一个左值,因为它还没有占据明确的内存。*ptr 是一个左值,因为*ptr 这个指针已经占据了内存,其实*ptr 就是指针pa,既然pa 已经在内存中有了自己的位置,那么*ptr 当然也有了自己的位置。
下面是一些指针表达式的例子:
例七:
int a,b;
int array[10];
int *pa;
pa = &a; //&a 是一个指针表达式。
int **ptr = &pa; //&pa 也是一个指针表达式。
*ptr = &b; //*ptr 和&b 都是指针表达式。
pa = array;
pa++; //这也是指针表达式。
例八:
char *arr[20];
char **parr = arr; //如果把arr 看作指针的话,arr 也是指针表达式
char *str;
str = *parr; //*parr 是指针表达式
str = *(parr+1); //*(parr+1)是指针表达式
str = *(parr+2); //*(parr+2)是指针表达式
由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。
好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。在例七中,&a 不是一个左值,因为它还没有占据明确的内存。*ptr 是一个左值,因为*ptr 这个指针已经占据了内存,其实*ptr 就是指针pa,既然pa 已经在内存中有了自己的位置,那么*ptr 当然也有了自己的位置。