指针和多维数组
作者:互联网
指针与多维数组之间的关系
- 可知zippo为该数组首元素的地址,在本例中,zippo的首元素是一个内包含两个Int值的数组,所以zippo是这两个int值的数组的地址。下面进行分析:
- 因为zippo是数组首元素的地址,所以zippo的值和&zippo[0]的值相同。而zippo[0]本身是一个内包含两个int值的数组,所以zippo[0]的值和它首元素的地址(&(zippo[0][0]))相同,简而言之:zippo[0]是一个占用一个Int大小的地址,zippo是一个占用两个int大小的地址。由于一个int和内包含两个int的数组都开始于同一个地址,所以zippo和zippo[0]的值相同。
- 给指针或地址加1 ,其值会增加对应类型大小的数组。在这方面zippo和zippo[0]的不同。
- 解引用一个指针时,得到应用对象代表的值。因为zippo[0]是该数组的首元素(zippo[0][0]的地址),所以*(zippo[0]) == zippo[0][0]。与此类似,*zippo代表该数组首元素(zippo[0])的值,但是zippo[0]本身是一个int类型的地址。该值的地址是&zippo[0][0],所以*zippo就是&zippo[0][0]。对两个表达式应用解引用运算符表明:**zippo == *zippo[0],相当于zippo[0][0],即一个int类型的值。简而言之:zippo是地址的地址,需要解引用两次才能得到原始值。此又称双重间接
例子如下:
显然用指针表示法来表示多维数组会很麻烦,所以建议使用数组表示法
指向多维数组的指针
如何声明一个指指针变量pz指向一个二维数组?在编写类似zippo这样的二维数组时会用到这样的指针。把指针声明为Int类型还不够,因为指向Int只能与zippo[0]的类型匹配,说明指针指向一个Int值。但zippo是它首元素的地址,该元素是一个内含两个int类型值的一维数组。因此,pz必须指向一个内含两个int类型值的数组,如下:
如前所述,虽然pz是指针,但也可以使用pz[2][1]这样的写法
zippo[m][n] == *(*(zippo + m) + n)
pz[m][n] == *(*(pz+ m) + n)
指针的兼容性
指针之前的赋值很严格,不是同一基本数据类型的指针或值无法赋值
更复杂的类型也是如此:
以上无效的前你两个赋值表达式都是指向了不同的类型:
pt指向了一个Int类型值,而ar1指向一个内含3个int类型元素的数组
pa指向一个内含3个Int类型元素的数组,所以与ar1兼容,但ar2指向一个内含2个Int类型元素的数组,所以不兼容
p2是指向指针的指针,他指向的指针指向int(绕死我了),而ar2是指向数组的指针,该数组内含2分int类型的元素,所以p2与ar2不兼容
*p2是指向int的指针,与ar2[0]兼容。因为ar2[0]是指向该数组首元素的指针(ar2[0][0]),所以ar2[0]也是指向int的指针。
前文提到过,把const指针赋值给非const指针不安全,但非const指针赋值给const指针可以,但只限于一级解引用,在进行二级解引用时,这样的赋值也不安全:
所以在c++中已经不允许这样的写法出现,即非const指针不可以赋值给const指针。
函数和多维数组
如果要编写处理二维数组的函数,首先要能正确的理解指针才能写出,通常使用数组表示法进行相关操作:
注意,下面声明不正确:
int sum2(int ar[][], int rows); //错误的声明
编译器会把数组表示法转换为指针表示法,列如:ar[1]转换为ar + 1,要知道ar所指向的对象大小,如果第二个括号为空,编译器则不知道该怎么处理。
也可以在第一个括号填值,但编译器会忽略。
一般而言,声明一个指向N维数组的指针时,只能省略最左边的值:
int sum(int ar[][2][3][4], int rows);
因为它只用于表明这是一个指针,而其他的方括号则用于描述指针所指向数据对象的类型。
标签:指向,int,地址,数组,zippo,多维,指针 来源: https://www.cnblogs.com/xingyboy/p/16210753.html