C语言笔记第二章指针的算术运算
第二章指针的算术运算
指针可以加减一个整数。指针的这种运算的意义和通常的数值加减
运算是不一样的。例:
例2:
1。char a[20];
2 .int * ptr = a;
...
...
3 .ptr++;
在上面的例子中,指针ptr的类型是int*,它所指向的类型是int,它被初始化为指向整数
变量a,在接下来的第三句中,指针ptr被加上1。编译器是这样处理的:它把sizeof(int)加到指针
ptr的值上。在32位程序中,它加上4。因为地址是以字节为单位的
,所以ptr指向的地址从原变量A的地址到高位地址增加了4个字节。
由于char类型的长度是一个字节,所以原来ptr是指向数组a的单元0开头的四个字节,
此时,它指向从数组a的单元4开始的四个字节,
我们可以用指针和循环来遍历一个数组。看例子:
例3:
例3:
int array[20];
int * ptr = array;
...
/这里省略了为整数数组赋值的代码。
...
for(I = 0;I {
(* ptr)++;
ptr++;
}
此示例将整数数组中每个单元格的值加1。由于指针ptr在每个周期递增1,
可以在每个周期访问数组的下一个单元。
再看一个例子:
例4:
1。char a[20];
2 .int * ptr = a;
...
...
3 .ptr+= 5;
本例中ptr加5,编译器是这样处理的:将指针ptr的值加5
乘以sizeof(int)就是32位程序中加5乘以4=20。因为地址的单位是字节,所以当前ptr指向的地址比ptr加5后指向的地址向更高的地址方向移动了
20个字节。本例中,加5之前的ptr指向数组a的单元0的前四个字节
,加5之后,ptr已经指出了数组a的合法范围,虽然这种情况在应用中会提出问题
,但在语法上是可能的。这也体现了指针的灵活性。
如果在上面的例子中ptr减5,处理是类似的,只是ptr的值减5倍sizeof(int),新ptr指向的地址将比原ptr指向的地址向低位地址侧
移动20个字节。
综上所述,指针ptrold加整数n后,结果是一个新的指针ptrnew。
ptrnew的类型与ptrold的类型相同,所指向的类型
ptr new与ptrold所指向的类型相同
。ptrnew的值将比sizeof(ptrold)的值增加n倍sizeof(ptr old指向的类型)words
。也就是说,ptrnew所指向的内存区域会向比ptrold所指向的内存区域更高的地址方向移位
n倍sizeof(ptrold所指向的ptrold类型)字节。
指针ptrold减去整数n后,结果是一个新的指针ptrnew。ptrnew的class
类型与ptrold的类型相同,ptrnew指向的类型与ptrold指向的类型相同。pt
rnew的值会比那个sizeof(ptrold指向的类型)减少n倍sizeof(ptr old指向的类型)字节,也就是说
ptr new指向的内存区域会向低位地址方向移动n倍siz
eof(ptr old指向的类型)字节。
0条评论