《每日一练合集》
2.16 指针运算
指针的合法运算有以下几个:
- 指针与整数的加减
- 同类型指针的比较
- 同类型指针的加减
当两个指针进行算术运算的时候,指针指向的地址值并不是单纯的数据移动,而是结合指针指向的数据类型的大小,如下:
注意!!!如果两个指针指向的不是同一个数组中的元素,相减之后的结果是未定义的。
指针还可以进行关系运算,也就是比较,如下的代码用指针的运算实现了数组的清零:
2.17 访问数组的形式
重点是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]
.
2.18 很容易忽略的数组名是常量
一些涉及到数组的题目,看似考察了众所周知的特性,实际上埋得坑远不如此,如下:
这道题就很容易看错,s += 2;
想当然地把s移动2个char的距离,指向‘c’
,如果是这样想,那就正中下怀!!!
这里考察的是:数组名是一个地址常量,不可以修改常量,所以会编译报错!!!
2.19 指针在二维数组中的使用
笔试经常会考察指针结合二维数组的问题,比如有一个数组:
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]
例子如下:
2.20 二维字符串数组问题
既然数组说明了一行有10个元素,那就不以实际存在的判断了。