数组的指针与指针的数组

C语言中数组和指针是分不开的,这篇文章主要来记录一下C语言中数组和指针的关系

1. 简单的数组和指针的关系

1
2
3
4
5
6
int a[10]; //定义了一个长度为10的整型数组
int *p; //定义一个整型指针

p = a; //将数组a的地址赋给指针p
a[0] = 1; //给数组的首数字赋值
*(p+1) = 10;//给数组的第二个数字赋值

从上面的例子可以看出,当我们定义了一个数组的时候,其实是在内存中申请了一块相应大小的空间,数组的名称a代表的是数组的首元素的地址。我们也知道,指针是一种变量,里面存放的就是地址这种数,所以可以把a的值赋值给指针p,因为它们从本质上讲都是地址变量(没有这说法,自造的)

我们可以使用数组下标的方式来访问数组里的元素,也可以使用将指针的指向移动的方式来访问数组里的元素,就像上面的例子的最后两条语句,两种方式在本质上是几乎一样的,都是将等号右值填入到等号左边所指代的地址空间里去,只不过表示这个地址空间的方式不太一样。

当然在上面的例子里, pa的位置是不一样的,只不过pa对应的内存空间里存放了相同的地址,所以就可以使用不同的方式去操作这个数组,而能得到相同的操作结果

2. 数组的指针和指针的数组

简单一维数组前面已经讨论过了,这种容易引起混淆的更多出现在二维数组里

首先要明确定义数组的[]的优先级是要高于定义指针的*的优先级的,再来看下面这个例子

1
2
3
4
5
6
int *p_a[10]; //定义了一个指针的数组,这个数组有10个元素,每个元素都是一个指针,里面存放地址,
//这个定义申请了10个指针内存大小,数组名是p_a,指针名字用下标引用
//没有赋值,里面指针的指向并不明确
int (*p_p)[10]; //定义了一个数组的指针,这个指针指向一个含有10个元素的数组,这个定义只申请了
//一个指针的内存大小,这个数组是匿名数组
//这个指针的指向是明确的,指向内存空间中一段连续的10个int大小的内存区域的首地址

指针加一的步长和指针指向的数据类型是相关的,看上面的例子,p_a是指针数组,数组里的值是地址,这个地址是指向int型变量,所以步长就是一个int变量的长度;p_p是数组指针,指针指向的是一个int [10]匿名数组,步长就是10个int型变量的长度

  • © 2019-2022 Wendell
  • Powered by Hexo Theme Ayer

请我喝杯咖啡吧~

支付宝
微信