一般的都是讲数组指针和数组混为一谈。但是经过我的实验的话,他们两个其实是不一样的。
首先我们来看一下数组指针以及数组的类型表示:
BASETYPE (*NAME)[COUNT]; // 数组指针
BASETYPE NAME[COUNT]; // 数组
因为数组变量实际上是数组首地址的指针,因为一维数组再内存中的空间是连续的(至于多维数组,实际上就是通过将其他数组首地址的指针作为元素来实现的,理论上来说,即使是将一个数组作为它本身的一个元素也是可以的)。所以可以通过偏移这个指针(数组变量的值)来实现遍历数组的效果。但是作为数组指针的话,这样字是不行的。
但是同时经过我的实验,假设有一个数组指针p,类型为int (*)[5]
。我打印用16进制打印*p以及p的值,实际上他们的值是相同的。同时,假设有一个数组变量的话,使用gdb打印这个数组变量的值,会直接将这个数组打印出来,而打印出这个数组的地址的话会打印这个数组首元素的首地址(这个可以自己去验证一下)。
这个证明了什么呢,证明作为数组指针以及数组来说,他们的值是相同的。但这只是证明了他们的值相同,并不证明他们完全相同。这是因为数据类型的原因。
还有一点,我们都知道。在使用数组作为函数参数的时候。传递进去的数组一定会退化成为一个指针。一维数组会变成一个单纯的指针,而二维数组这会变成一个二维指针,依次类推。
但是如果是作为一个数组指针传递进去的话,就不存在这样子的问题。简单来说就是我再函数中通过数组指针取值依旧能过的到数组的大小的信息。
其实我觉得饿具体的数组指针和数组是怎么一回事。只有写C的才清楚...
网友评论