【指针的算术运算】
指针运算与普通数值运算不同,先给个例子吧;
eg:
char a[20];
int *p =(int *)a; //强制类型转换并不会改变a 的类型
p ++;
/* 结合【C语言的指针大归纳Two】的知识,我们可以清晰的知道*/:
指针p 的类型==>int*,
指向的类型==>int,
被初始化==>指向整型变量a。
假如是在32 位机中的。
在程序p++中,指针p 被加了1,编译器是这样处理的:
它把指针p 的值 加上了sizeof(int),相当于被加上了4(int类型的大小)。
由于地址是用字节做单位的,故p 所指向的地址由原来的变量a 的地址向高地址方向增加了4 个字节。
但由于char 类型的长度是一个字节,所以,原来p 是指向数组a 的第0 号单元开始的四个字节,
此时指向了数组a 中从第4 号单元开始的四个字节。
用一个指针和一个循环来遍历一个数组:
eg:
int a [40]={0};
int *p =a ;
for(i=0;i<40;i++)
{
(*p )++;
p ++;
}
将整型数组中各个单元的值加1。由于每次循环都将指针p
加1 个单元,所以每次循环都能访问数组的下一个单元。
指针的灵活性
char a[20]="cai jin long ";
int *p =(int *)a;
p +=5; // 假如是p - =5;呢?
p +=5;语句中编译器是这样处理的:将指针p 的值加上5 乘sizeof(int), 即5*4=20。
因为地址的单位是字节,所以现在的p所指向的地址比起加5后的p 所指向的地址来说,
向高地址方向移动了20 个字节。
虽然p 已经指向了数组a 的合法范围之外了,但在语法上还是可行的。
如果是p - =5;语句,结果差不多。
p 的值是被减去5 乘sizeof(int),新的p 指向的地址将
比原来的p 所指向的地址向低地址方向移动了20 个字节。