首页 > 代码库 > C指针解析 ------ 指针的算术运算

C指针解析 ------ 指针的算术运算

       本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020

       指针是一个特殊的变量,表示一个地址,而地址可以上减去或加上一个整数,从而可以表示新的地址.

     下面通过一段代码来分析指针的算术运算: 

#include <stdio.h>
int main(){
	int i;
	char str[]={'a','b','c','d','e'};
	int *p = str;
	char *q = str;
	q++;
	p++;
	printf("数组str的首地址:%x\n",str);
	printf("指针q指向的内在区:%x\n",q);
	printf("指针p指向的内存区:%x\n",p);
	printf("数组的第一个元素的值:%c\n",*str);
	printf("数组的第一个元素的值:%c\n",*p);
	//遍历数组第一种方法,下标法
	printf("遍历数组第一种方法,下标法:");
	for(i = 0 ;i < sizeof(str);i++)
		printf("%c",str[i]);
	
	//遍历数组第二种方法,数组名指针法
	printf("\n遍历数组第二种方法,数组名指针法:");
	for(i = 0 ;i < sizeof(str);i++)
		printf("%c",*(str+i));	
	
	//遍历数组第三种方法,指针法
	q = str;
	printf("\n遍历数组第三种方法,指针法:");
	for(i = 0 ;i < sizeof(str);i++)
		printf("%c",*q++);		
}
     执行结果:


         可以看出,数组的首地址为163c4730.通过上节的指针的概念和四个要素,很容易得知,指针q的类型为char*,且指针q指向的类型为char; char *q = str;的作用是将数组str的首地址赋给指针q,也就是说指针q的值或q指向的内存区就是数组str的首地址. 接下来,指针q自加1,这时,编译器是这样处理的,它把指针q的值加上了sizeof(char),也就是在原来的地址的基础上向后移动了一个字节,即指针q的指向的内存区为163c4730+1=163c4731. 同理,指针p的类型为int*,且指向的类型为int,  int *p = str; 作用也是将数组的首地址赋给指针p,p++,编译器将把指针p的值加上了sizeof(int),也就是在原来的基础上向后移动了4个字节,即指针p指向的内存区为163c4734,所以指针p在自加前,是指向数组第0号单元开始的四个字节,在自加1后指向了数组第四号单元开始的四个字节。

        因此,判断指针向后移动的多少位时,需要判断指针指向的类型。

      

        也可以用指针来遍历数组,如上述代码,可以使用数组名,因为这里的数组名就是指向了数组的第0号单元,如果在此基础上加上一个偏移量,就可以访问数组的其他元素,因此,可以用数组名+偏移量来遍历数组。同理,另设一个指针指向数组的第0号单元,每次指针自加1,就可以遍历整个数组,这里要注意,指针的所指向的类型,要和数组的元素类型要一致,所以上述代码中用指针q来遍历数组,而不是用指针p来遍历。

        当然,如果指针减去一个整数,处理过程和加上一个过程类似,只是向前移动了,而不是向后移动。

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


  

       

C指针解析 ------ 指针的算术运算