上QQ阅读APP看书,第一时间看更新
4.3 指针与数组
在C/C++中,数组是一块连续的内存,而且和指针的关系非常密切,一般我们指针的算术操作都是应用在数组中。
int a[] = { 1, 2, 3, 4 }; int* pa = a; int* pb = &a[0];
将上面的a、pa、pb这3个地址打印出来,会发现它们的地址都是一样的,都指向数组a的首地址,上面的代码首先初始化了一个拥有4个元素的数组,这种写法,已经固定分配了大小为4个int的内存,不可以存入第5个元素了。
可以通过a[1],a[2] 这种下标操作来取出元素,也可以通过*(pa + 1),*(pa + 2)来取出,同时也可以直接操作 *(a + 1),因为数组本身就是一个指针,不同的是,当用sizeof操作符来求a的长度时,返回的是数组的大小4*4,而求pa或pb的时候,返回的是4。
二维数组和指向指针的指针用得比较少,这里也简单介绍一下。
int b[2][4] = { 0, 1, 2, 3, 4, 5, 6, 7 };
上面的数组b是一个2列4行的数组,其中包含了8个元素,可以理解为b由两个长度为4的数组组成,这时b不等于int*,b是二级指针,int**,当用*b将b求解出来的时候,打印后会发现这是第一个数组的地址,而**b才能解析出数组的第一个元素。
对这个二维数组赋值的顺序是先将第一个数组的4个int填满,再填充第二个数组,在内存中的显示如图4-2所示。
图4-2 二维数组
那么使用二级指针b如何来获取数组中的元素呢?
❏**b取出第1个数组中的第1个元素。
❏**(b + 1)取出第2个数组中的第1个元素。
❏*(*b + 1)取出第1个数组中的第2个元素。
❏*(*(b + 1) + 1)取出第2个数组中的第2个元素。
而用int* p来指向b,可以用p来取出二维数组中的所有元素,*p 取出第1个数组中的第1个元素,*(p + 4)取出第2个数组中的第1个元素。