上篇我们讲到了指针的传值调用和传址调用,本篇我们继续往下讲指针数组
1.数组名的理解
我们在使用指针访问数组的时候,最简单的访问就是下图所示的方法:
这是一个简单的读取地址并打印数组,但是打印数组难道就这一种方法吗?当然不是的,我们可以用下图的方法去打印:
我们可以看到两段代码的不同之处在于一个是数组名另一个则运用了(&)取地址操作符。但是打印出来的结果是一样的,因此我们可以得出结论:数组名就是数组首元素的地址。
既然都打印了数组,我们总要打印字符长度看看吧?
从上图结果可见,sizeof打印的长度写的是40,难道不应该是4/8吗?这里就要涉及到一个新的知识点了:sizeof中单独放数组名,这里的数组表示整个数组,计算的是整个数组的大小,单位是字节。
既然有了arr和&arr[ 0 ]两种打印的方法,那么&arr呢?我们不妨直接写代码打印测试一下: 从结果来看:无论是arr &arr &arr[ 0 ]他们打印的结果都是一样的。但是!可以看到&arr如果+1,就和arr+1 &arr[ 0 ]不一样了,这是因为arr &arr[ 0 ]都是数组首元素的地址,所以只有4个字节,而&arr则是代表着整个数组,+1则是在跳过了整个数组的基础上再加4个字节,即第44个字节。因此他们的地址是不一样的。
结论:sizeof和&加上数组名代表的是整个数组,进行运算则是计算的整个数组的大小,而其他的都是代表数组首元素的地址。
2.使用指针访问数组
我们在了解了指针下不同数组名的含义后,就要试着去运用指针去访问访问数组,那首先我们就要试着用指针输入输出数组:
这是一个简单的for循环输入数组元素,数组初始化肯定是必不可少的,重点在于:指针变量p接收了数组arr的地址后,用for循环限制数组元素的输入个数,然后循环用指针访问数组。而输出的时候也是使用了解引用操作符和指针去访问数组,这就是指针访问数组的一种了。而既然设计了这样子的输出,自然是要查看结果的,可以看到输入0~9后,输出的结果也是0~9。这个与本身数组输入的写法有没有差别呢?我们再用数组输入的方法去验证一下。
如上图所示,for循环用数组名去输入的情况下,输入1~10的时候输出的结果依然是1~10,可见从结果上与上面指针访问数组的方法是一模一样的,因此是可以用指针去访问数组的。那么指针访问数组还有没有其他的方法呢?当然是有的。
从上图可见输出的部分用的是p[ i ],然后运行输入1~10后输出的结果和上面的方法是一样的,证明p [ i ]是可以使用的,那为什么可以使用呢?
这是因为int* p = arr,使指针变量p接收了arr首元素的地址,而arr[ i ]是一开始循环输入数组元素的方法,只是把arr [ i ] 中的arr换成了p,自然是可行的。
从上述的三种输出方式可以得出结论:在指针输出数组的情况下*(p + i) = *(arr + i) = p[ i ]
这就是本篇要讲的全部内容了,希望对各位能够有所帮助,我们下篇再见。