一个表达式的结果如果是一个指针,那么这个表达式就叫指针表式。下面是一些指针表达式
的例子:
例七:
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 当然也有了自己的位置。
5、数组和指针的关系
数组的数组名其实可以看作一个指针。看下例:
例九:
intarray[10]={0,1,2,3,4,5,6,7,8,9},value;
value=array[0]; //也可写成:value=*array;
value=array[3]; //也可写成:value=*(array+3);
value=array[4]; //也可写成:value=*(array+4);
上例中,一般而言数组名array 代表数组本身,类型是int[10],但如果把array 看做指针的话,
它指向数组的第0 个单元,类型是int* ,所指向的类型是数组单元的类型即int。因此*array
等于0 就一点也不奇怪了。同理,array+3 是一个指向数组第3 个单元的指针,所以*(array+3)
等于3。其它依此类推。
例十:
char *str[3]={
"Hello,thisisasample!",
"Hi,goodmorning.",
"Helloworld"
};
chars[80];
strcpy(s,str[0]); //也可写成strcpy(s,*str);
评论0