让你不再害怕指针!

 如下例1:

 int *ptr;
char *ptr;
int **ptr;
int (*ptr)[3];
int *(*ptr)[4];

一、指针的类型

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

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

二、指针所指向的类型

       当你通过指针来访问指针所指向的内存区时, 指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看, 你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。 例如:
 

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

在指针的算术运算中, 指针所指向的类型有很大的作用。
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。

 

三、指针的值或者叫指针所指向的内存区或地址

       指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在 32 位程序里, 所有类型的指针的值都是一个 32 位整数, 因为 32 位程序里内存地址全都是 32 位长。 指针所指向的内存区就是从指针的值所代表的那个内存地址开始, 长度为 si zeof(指针所指向的类型)的一片内存区。 以后, 我们说一个指针的值是 XX,就相当于说该指针指向了以 XX 为首地址的一片内存区域; 我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址
       指针所指向的内存区和指针所指向的类型是两个完全不同的概念。 在例一中, 指针所指向的类型已经有了, 但由于指针还未初始化, 所以它所指向的内存区是不存在的, 或者说是无意义的。
 

四、指针本身所占据的内存区

指针本身占了多大的内存? 你只要用函数 sizeof(指针的类型)测一下就知道了。 在 32 位平台里, 指针本身占据了 4 个字节的长度。
 

五、总结一下:

       一个指针 ptrold 加(减)一个整数 n 后, 结果是一个新的指针 ptrnew,ptrnew 的类型和 ptrold 的类型相同, ptrnew 所指向的类型和 ptrold所指向的类型也相同。 ptrnew 的将比 ptrold 的值增加(减少)了 n 乘sizeof(ptrold 所指向的类型)个字节。 就是说, ptrnew 所指向的内存区将比 ptrold 所指向的内存区向高(低)地址方向移动了 n 乘sizeof(ptrold 所指向的类型)个字节。

发布了76 篇原创文章 · 获赞 32 · 访问量 7913

猜你喜欢

转载自blog.csdn.net/wuwuku123/article/details/104003302
今日推荐