一、指针的类型和指针所指向的类型 1. 指针的类型是指指针本身的类型,在一个指针声明中如何判断一个指针的类型呢?从语法的角度看在一个指针的声明中,去掉指针的变量名,其余的就是指针的类型。如: (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 2.指针所指向的类型 指针所指向的类型决定了编译器将把那片存储区里的内容当作什么来看待 如何从一个指针的声明中正确的得出指针指向的类型呢?从语法角度看,只需要将指针声明中的指针变量名字和名字左边的指针声名符去掉,剩下的就是指针指向的类型。 (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 3.指针的值或者指针所指向内存区域的值 二、指针的运算符 1.char a[20]; 在语句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的值加上5乘sizeof(int),在32位的程序中就是20,由于地址按照字节存储,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节,在这个例子中没加5之前的ptr指向了数组a的合法范围之外了,虽然这种情况会在应用上出问题,但在语法上却是可以的。 两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义。两个指针可以进行减法,但必须类型相同一般用在数组中。 |
|
来自: albert_wei > 《C》