1、指针的类型 
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。

(1)int *ptr; 指针的类型是int *

(2)char *ptr; 指针的类型是char *

(3)int **ptr; 指针的类型是 int **

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

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

把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。 例如:

(1)int *ptr; 指针所指向的类型是int

(2)char *ptr; 指针所指向的的类型是char

(3)int **ptr; 指针所指向的的类型是 int *

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

(5)int *(*ptr)[4]; 指针所指向的的类型是 int *()[4]
3、指针的值,或者叫指针所指向的内存区或地址。  
指针的值就是,指针所指向的变量所占用的内存地址。
例如:
int a=5; 声明一个int类型变量
int *p=&a; 申明一个指针,&a是a所占用的内存地址编号,结合后就是指针*p指向a所占用的内存地址编号
printf("%p\n",*p); 输出地址
4、指针本身所占据的内存区。
指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。
指针占用的内存一般取决于电脑本身,在64位操作系统的电脑里指针本身所占用的内存为8个字节,32位占用4个字节。
5、指针和数组
 int a[20];
 int *p=a;
p++;
指针p的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针p加了1,编译器是这样处理的:它把指针p的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故p所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。

由于int类型的长度是4个字节,所以,原来p是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第1号单元开始的四个字节。
posted on 2015-10-27 20:01  初秋的毛毛虫  阅读(120)  评论(0编辑  收藏  举报