指针详解(2)

来源:互联网 发布:新动力淘宝店 编辑:程序博客网 时间:2024/04/27 22:42

一、运算符&和*

这里&是取地址运算符,*是间接运算符。

&a 的运算结果是一个指针,指针的类型是 a 的类型加个*,指针所指向的类型是 a 的类型,指针所指向的地址嘛,那就是 a 的地址。

*p 的运算结果就五花八门了。总之*p 的结果是 p 所指向的东西,这个东西有这些特点:它的类型是 p 指向的类型,它所占用的地址是 p所指向的地址。

例一:

int a=12; int b;

p=&a;

int *p; int **ptr; //&a 的结果是一个指针,类型是 int*,指向的类型是 int,指向的地址是 a 的地址。

*p=24; //*p 的结果,在这里它的类型是 int,它所占用的地址是p 所指向的地址,显然,*p 就是变量 a。

ptr=&p; //&p 的结果是个指针,该指针的类型是 p 的类型加个*,在这里是 int **。该指针所指向的类型是 p 的类型,这里是 int*。该指针所指向的地址就是指针 p 自己的地址。

*ptr=&b; //*ptr 是个指针,&b 的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b 来给*ptr 赋值就是毫无问题的了。

**ptr=34;  //*ptr 的结果是 ptr 所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果是一个 int 类型的变量。

二、指针表达式

一个表达式的结果如果是一个指针,那么这个表达式就叫指针表式。

下面是一些指针表达式的例子:

例二:

int a,b;

int array[10];

int *pa;

pa=&a;

Int **ptr=&pa;

*ptr=&b;

pa=array;

pa++;

例三:

char *arr[20];

char **parr=arr;  /如果把 arr 看作指针的话,arr 也是指针表达式

char *str;

str=*parr;

str=*(parr+1);

str=*(parr+2);

//*parr 是指针表达式 ,*(parr+1)是指针表达式,*(parr+2)是指针表达式 ,这也是指针表达式。

//&a 是一个指针表达式。&pa 也是一个指针表达式。*ptr 和&b 都是指针表达式。由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。

当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。在例七中,&a 不是一个左值,因为它还没有占据明确的内存。*ptr 是一个左值,因为*ptr 这个指针已经占据了内存,其实*ptr 就是指针 pa,既然 pa 已经在内存中有了自己的位置,那么*ptr 当然也有了自己的位

置。



0 0
原创粉丝点击