数组与指针的关系

概念说明

数组

  • 一维数组
int array
  • 二维数组
int array_2 [][10]
注:低维度的数据元素个数必须显式定义,高维度可以省略
  • 指针数组(数组元素为指针的数组)
char *p[]

指针

  • 一级指针:
*p
  • 二级指针:
**p
  • 数组指针(指向数组的指针):
int (*p)[10] 
// 这里是指向二维数组的指针形式,10 必须显式说明

常见的问题与解答

问题1 :数组名和指针的区别?

答:

数组名是数组的首地址,是一个常量,而不是变量
指针是一种变量类型
变量可以赋值给常量,常量不可以赋值给变量
《c和指针》的说法为,表达式的左值必须是可修改的,也就是说数组名不可以是表达式的左值

问题2:如何把指针指向二维数组呢?

答:

有两种形式:
    1 使用数组指针,C语言中指向二维数组的指针的形式为:
      int (*p)[10](为什么这么写?解释在下面)
    2 由于二维数组的元素在内存中是按照先行后列的顺序顺序存储的,因此:
      可以把数组的首地址“显式”的赋值给一个一级指针,形式如下:
      int *p = &array[0][0]
      但是注意:int *p = array,这种形式在编译器中会报错

问题3:二级指针可以指向二维数组吗?

答:

是不可以的!编译器同样会报错。
从这里可以看出,二维数组寻找数组的元素也许并不是对一位数组的首地址进行解引用
操作,很可能是简单的进行行列的计算得出数据的位置(数据是顺序存储的),也就是
为什么二维数组的列数必须是固定的。

问题4:什么类型的指针可以指向指针数组?

答:

顾名思义,指针数组里面的元素都是指针,也就是说对数组地址进行解引用操作之后并不能
得到数据,而是一个指针,必须对这个指针再进行一次解引用操作,才能得到一个具体的数
据。
上面的定义是不是和二级指针的定义很类似呢?
是的,C语言中可以用二级指针指向指针数组。

问题5:对指针数组和数组指针形式的解释?

答:

指针数组:char *p[] :
[]的优先级大于*,因此p先和[]结合,解释为一个数组,char * 表面了数组里面元素的类型,
为指向char型的指针

数组指针:常见的是指向二维数组或者更高维数组的指针
指向二维数组的指针:char (*p)[10]:
()的优先级大于[],因此* 和p先结合,解释为一个指针,char修饰的是数组,包含了若干个
元素的数组。
也可以按照常规的数据定义方式:char(*)[10] p,char(*)[10]是数据类型,p是变量名,
只是为了好看把P前移了而已。
(注:实测后面这种形式在VS2017上编译并没有通过 --email:1059859967@qq.com)

问题6: char **argvchar *argv[]的区别

答:

相信你看完之后已经完全不用搜索帖子或者百度来解答这个问题了~~~

技术是在不断的讨论中进步的,如所述有不妥之处,希望能联系 1059859967@qq.com 进行指正,万分感谢!


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

字符设备驱动 上一篇