//指针的算术运算

/*
指针可以加上或减去一个整数,指针的这种运算的意义和通常的数值的加减运算的意义是不一样的,惟单元为单位。


*/
   char a[20];
   int *ptr = (int *)a;//强制类型转换并不会改变A的类型;
   ptr++;
   //指针PTR的类型是INT*,它指向的类型是INT,它被初始化为指向整形变量A,接下来的第三句中,指针PTR被加了1,它被初始化为指为指向整形变量A
   //接下来的第三句中,指针PTR被加了1,编译器是这样处理的,它把指针PTR的值加上了SIZEOF(INT),在32位程序中,是被加上了4,因为在32位程序中,
   //INT占四个字节。由于地址是用字节做单位的,故PTR所指向的地址由原来的变量A的地址向高地址方向增了四个字节。由于CHR类型的长度是一个字节所以,
   //原来PTR是指向数组A的第零号单元开始的四个字节,此时指向了数组A中从第四个现代化单元开始的四个字节。我们可以用一个指针和一个循环来遍历一办公桌数组;
   int array[20] = {0};
   int *ptr = array;
     for (i = 0; i < 20; i++)
	 {
		 (*ptr)++;
		 ptr++;

	 }
/*
在这个例子将整形数组中各个单元的值加1,由于每次循环都针指针PTR加一个单元,所以每次循环都访问数组的下一个单元。
	  */
	 char a[20] = "You_are_a_girl";
	 int *ptr = (int *)a;
	 ptr +=5;
/*
	 这个例子中,PTR被加上了5,编译器早到这样处理的:将指针PTR的值加上5乘SIZEOF(INT),在32程序中就是加了5乘 4 = 20。由于地址
的单位是字节,故现在的PTR所指向的地址比起加五后的PTR所指向的地址来说,向高地址方向移动了二十个字节,在这个例子中,没加5前的PTR指向了数组A的
第0号单元开始的四个字节,加5后,PTR已经指向了数组A的合法范围之外了,虽然这种情况在应用上会出问题,但在语法上却是可以的,这也体现了指针的灵活性。
如果上例中,PTR是被减去了5,那么处理过程大同小异,只不过PTR是的地址向低地址方向移动了二十个字节。。
	 */
# include <stdio.h>

	 int main()
	 {
		 char a[20] = "You_are_a_girl";
		 char *p = a;
		 char **ptr =&p;

		 //printf("p = %d\n", p);
		 //printf("ptr = %d\n", ptr);
		 //printf("*ptr = %d\n", *ptr);
		 //printf("**ptr = %c\n", **ptr);
		 ptr++;
		 //printf("ptr = %d\n", ptr);
		 //printf("*ptr = %d\n", *ptr);
		 //printf("**ptr = %c\n", **ptr);

	 }

	 /*
	 误解区一:输出答案为Y和o

  误解:PTR是一个CHAR的二级指针,当执行PTR++;时,会使指针加一个SIZEOF(CHAR)所以输出如上结果,这个可能只是少部分人的结果,

     误解区二:输出答案为Y和a
  
	误解:PTR是一个CHAR的二级指针,当执行PTR++;时,会例指针加一个SIZEOF(CHAR*)(有可能会有人认为这个值为1,那就会得到误区一的案,这个
	值应该是4,参考前面的内容,)即&P+4;那进行一次取值不就指向数组中的第五个元素了吗?那输出的结果不就是数组中第五个元素了吗?答案是否定的。

   
	 正解:


  PTR的类型是 CHAR**,指向的类型是一个CHAE*类型,该指向的地址就是P的地址(&p),当执行PTR++;时,会使指针加一个SIZEOF(CHAR*),即&p + 4; 那*(&P + 4)指向哪呢?这个你去问。。,或者他会告诉你在哪?所以最后的输出的结果会是一个有随机值,或许是一个非法操作。


  总结:


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

  指针和指针进入加减:

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

 

posted on 2012-04-16 22:28  BarneyX  阅读(545)  评论(0编辑  收藏  举报