分享

指针

 albert_wei 2013-01-06

一、指针的类型和指针所指向的类型

1.      指针的类型

指针的类型是指指针本身的类型,在一个指针声明中如何判断一个指针的类型呢?从语法的角度看在一个指针的声明中,去掉指针的变量名,其余的就是指针的类型。如:

1int *ptr;                            //指针的类型是int *

2char *ptr;                           //指针的类型是char*

3int **ptr;                           //指针的类型是int**

4int (*ptr)[3];                        //指针的类型是int (*)[3]

5int *(*ptr)[4];                       //指针的类型是int*(*)[4]

2.指针所指向的类型

指针所指向的类型决定了编译器将把那片存储区里的内容当作什么来看待

如何从一个指针的声明中正确的得出指针指向的类型呢?从语法角度看,只需要将指针声明中的指针变量名字和名字左边的指针声名符去掉,剩下的就是指针指向的类型。

1int *ptr;                            //指针指向类型是int

2char *ptr;                           //指针指向类型是char

3int **ptr;                           //指针指向类型是int*

4int (*ptr)[3];                        //指针指向类型是int () [3]

5int *(*ptr)[4];                       //指针指向的类型是int *()[4]

3.指针的值或者指针所指向内存区域的值

   指针的值是其指向的变量在内存中的存储地址,在32位的程序中,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。因此指针的值是这块内存区域的首地址。

   在实际的编程中,当我们使用一个指针时,我们应该考虑到这个指针的类型是什么?指针指的类型是什么?这个指针指向了哪里?

二、指针的运算符

1.char a[20];

 int *ptr = (int *)a;         //强制类型转换但不会改变a的类型

 ptr++;

在语句ptr++中,指针ptr被加了1,编译器的处理是:把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4,这是由于在32机器中int占用4个字节。地址是用字节来作为单位的,故ptr指向的地址由原来的变量a的地址向高地址方向增加了4个字节,但是char类型占用的是1个字节,所以原来ptr是指向数组a的第0号单元开始的第4个字节,此时指向了数组a中从第4号单元开始的四个字节。

再看一个例子:

char a[20] = “you_are_a_girl”;

int *ptr = (int *a);

ptr+=5;

在这个例子中ptr加了5而不是1,那么思考一下结果会是怎样呢?

编译器的处理是这样的:将指针ptr的值加上5sizeof(int),在32位的程序中就是20,由于地址按照字节存储,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节,在这个例子中没加5之前的ptr指向了数组a的合法范围之外了,虽然这种情况会在应用上出问题,但在语法上却是可以的。

两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义。两个指针可以进行减法,但必须类型相同一般用在数组中。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多