但是它也有让人抓狂的时候,一旦指针出问题,可能让你抓破脑袋也想不明白问题出在哪儿。放心,以后你们都会遇到的。」
老爹神秘地笑了笑。
「现在的内容还能听懂么?」
「嗯」
「好,能听懂的话我们就进行下部分内容——指针和数组的结合使用,睁大你们的眼睛看清楚了:
int a[]={1, 2, 3, 4, 5};
int *p = a;
看到没,我现在把一个int数组赋值给了一个指向int类型的指针,你们大胆地猜测一下会不会出错?」
「呵呵,我才懒得猜,把代码写出来编译一下不就知道会不会出错了么?」
我都被自己的机智感动了,当然了,这是因为我有所依仗。这一来嘛,区区两句代码而已,二来就是我打字速度快啊!
一顿操作猛如虎,编写、编译分分钟搞定。
「咦,还真的可以啊!」
「所以啊,记住,一个数组的数组名,就是这个数组的指针地址,也是数组首个元素的地址,换言之,上面的代码这句等效:
int* p =&a[0];
既然我们都已经拿到一个数组的指针地址了,那么接下来就可以对它的元素进行任意读写操作了。不过有一点要记住,一定不能超过数组的上下限,不然你就死翘翘!
我们可以利用指针来获取元素,或者给元素赋值:
or(int i = 0; i < 5; i++)
{
print(“%d,%d,%d“,a[i], p[i],*(p + i));
}
来来来,猜猜结果,猜中了有奖励哦!」
「哈哈,它们输出的内容是相同的!」
老爹话音刚落,我这边就已经看到了运行结果。
「嘿,任灵玥同学,你这么喜欢敲代码是吧,信不信我让你手写50遍!」
老爹做出一副很凶的样子说道。
「没错,它们输出的内容的确是相同的,那是因为它们的作用一模一样。刚刚我说了,数组名就是一个数组的指针地址,既然可以用a[i]来获取元素值,我们把a赋值给了p,那么p当然也是可以这样操作的。
至于p + 1嘛,是将指针指向的位置往从前位置移动一个单位。注意,这里的单位就和指针的指向的数据类型有关系了,如果指针指向的数据类型是一个int,那么它指向的就是下一个int数据,是double的话,就移动到下一个double数据。
换句话说,*(p + i)等效于p =(int*)((int)p + i * 4)。
我们首先把p的值,也就是一个地址值转换成int类型,假设数组a在内存中的地址是1234,p + i其实就是执行了1234 + i * 4,然后再把这个值,那么*(p + i)自然就是取的起始地址为1234 + i * 4这个int数据的值了。
而a[0]的地址是1234;
a[1」的地址是1234 + 1 * 4;
a[2」的地址是1234 + 2 * 4;
a[3」的地址是1234 + 3 * 4;
a[4」的地址是1234 + 4 * 4;