本文共 805 字,大约阅读时间需要 2 分钟。
指针的合法运算有以下几个:
当两个指针进行算术运算的时候,指针指向的地址值并不是单纯的数据移动,而是结合指针指向的数据类型的大小,如下:
注意!!!如果两个指针指向的不是同一个数组中的元素,相减之后的结果是未定义的。
指针还可以进行关系运算,也就是比较,如下的代码用指针的运算实现了数组的清零:
重点是C选项与D选项,本来&a
指向的数据类型是int [10]
,但是前面结果(int)*
类型强制转换,再+1就是移动一个int了;
D选项也是类似的,sizeof(int)
为4,如果是(&a + sizeof(int))
,则表示了在int数据类型的基础上移动四个int,就到了a[4]
,所以(char*)
的强制转换使&a
的数据类型变为char,则表示在char数据类型的基础上移动4个char,相当于一个int,这就指向了a[1]
.
一些涉及到数组的题目,看似考察了众所周知的特性,实际上埋得坑远不如此,如下:
这道题就很容易看错,s += 2;
想当然地把s移动2个char的距离,指向‘c’
,如果是这样想,那就正中下怀!!!
这里考察的是:数组名是一个地址常量,不可以修改常量,所以会编译报错!!!
笔试经常会考察指针结合二维数组的问题,比如有一个数组:
int a[4][5];
则结合指针可以得出如下结论:
&a = int(*)[4][5] a+i = int(*)[5] *(a+i) = int* *(*(a+i)+j) = int a[i][j] *(a[i]+j) = int a[i][j]
例子如下:
既然数组说明了一行有10个元素,那就不以实际存在的判断了。
转载地址:http://rxwzi.baihongyu.com/