c语言中的指针(二)

来源:互联网 发布:傲梦青少儿编程招聘 编辑:程序博客网 时间:2024/05/18 13:07

指针和多维数组

以二维数组为例,int arr[4][2],我们可以把它想象成一个一维数组,里面有四个元素,在这个一维数组中,他的每个元素都是另一个一维数组。我们已经知道,数组的名即使数组的首地址,那么对于int arr[4][2]来讲,arr是这个数组的首地址,他是二维数组的首地址,同时也是一维数组的首地址。我们假设一维数组有个名字叫arr1,那么arr1就是一维数组的首地址,也就是arr1[0]数据元素的地址,但是我们知道,一维数组是嵌套在另一个一维数组中去的,所以arr1[0]和arr1[1]是外层一维数组arr[0]的元素,因此,arr[0][0]的地址就等于arr1[0]的地址,也就等于arr的地址。但是这两个数组每个元素中的内容不同,内层数组中的元素是整形变量,而外层数组中元素是一个数组,细看其实是两个int型变量,所以对于内外层数组来讲,arr+1和arr[0]+1的值是不同的。arr+1是移动了两个int的值,而arr[0]+1则是移动了一个int类型的值。
指针在多维数组中的使用不是很容易,在多维数组中,因为arr[0]是数组首元素arr[0][0]的地址,所以arr[0][0] == *(arr[0]),而*(arr)是指二维数组首元素的地址,求出来的值应该是外层数组的第一个元素值,因为外层数组的元素是内层数组,所以这个值应该是一个指向内层数组的地址,如此看来,在对这个内层数组地址取一次值,我们便可以取到内层数组中的元素,事实我们也只有内层数组中存储着有用的数据。
因此 **arr == arr[0][0],即对二维数组名解两次引用便可获得二维数组中的首元素。

指针的数组和数组的指针

我们先分析一下,什么是指针的数组?什么是数组的指针?
指针的数组:
指针的数组就是指存在一个数组,他的所有元素都是指针类型。
int *px[2],这就是一个指针的数组,因为[]的优先级比*高,所以px会先和[]结合,生成一个px[2]数组,而int *代表了数组元素是指向int类型的指针。
数组的指针:
数组的指针就是存在一个指针,他指向一个已存在的数组。
int (*px)[2],这就是一个数组的指针,首先他先声明了一个指针px,然后指明了px指向一个内含两个int元素的数组。