ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

指针和多维数组

2022-04-30 17:33:04  阅读:267  来源: 互联网

标签:指向 int 地址 数组 zippo 多维 指针


  指针与多维数组之间的关系

  

  •   可知zippo为该数组首元素的地址,在本例中,zippo的首元素是一个内包含两个Int值的数组,所以zippo是这两个int值的数组的地址。下面进行分析:
  •   因为zippo是数组首元素的地址,所以zippo的值和&zippo[0]的值相同。而zippo[0]本身是一个内包含两个int值的数组,所以zippo[0]的值和它首元素的地址(&(zippo[0][0]))相同,简而言之:zippo[0]是一个占用一个Int大小的地址,zippo是一个占用两个int大小的地址。由于一个int和内包含两个int的数组都开始于同一个地址,所以zippozippo[0]的值相同。
  •   给指针或地址加1 ,其值会增加对应类型大小的数组。在这方面zippozippo[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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有