前言
接着上篇博客说,上篇博客我们已经知道了什么是指针,也明白了他的用途,这次我们就来看看指针和数组之间有什么奇妙的关系
数组和指针是一对好基友
我们都知道数组是存储在一块连续的存储空间中,也就是他可以表示一块连续的内存,我们需要得到数组中的某个元素,可以利用数组的下标,还可以如何得到呢?
指针可以操作地址,所以说,我们完全可以用指针来获取到数组的元素,甚至对数组元素进行修改, 可以看出数组和指针其实是一对好基友,他们非常相似,只不过适用的范围不同,指针使用的范围跟数组下标相比,当然要广的多。
数组名也是指针?
C语言的数组中的数组名其实也是一个指针,即数组第一个元素的地址(书上原话),看到这里我就有点蒙了,之前数组名都是类比的变量名,变量名就是分配的内存的名字,但是这里稍微有些不同,数组名是指针,也就是说数组名打印出来其实是一个地址,赶紧做了一个小DEMO,验证一下
首先我定义了一个数组,然后定义了一个指针,让指针指向数组,接着打印数组的名字,然后打印了数组的首元素
发现两者果然一样,得到的结论就是:数组名=数组首地址=数组元素首地址
//数组名就是数组的首地址
int i;
double score[]={98,87,65,43,76};
double *ptr_score=score;
//使用指针访问数组元素
printf("数组名是:%p\t数组首元素的地址:%p\n",score,&score[0]);
注:数组名是一个指针常量,不可以作为一个变量使用
利用指针取得数组的值(三种方式)
int array[]={15,20,25,30,35};
int i;
int *ptr_array=array;
//赋值完毕后,就可以使用指针访问数组元素了
for(i=0;i<5;i++)
{
//原始写法:
//printf("第%d个元素的值为%d\t地址为:%p\n",i+1,ptr_array[i],&ptr_array[i]);
//第二种
//printf("第%d个元素的值为%d\t地址为:%p\n",i+1,*(ptr_array+i),ptr_array+i);
//第三种
printf("第%d个元素的值为%d\t地址为:%p\n",i+1,*ptr_array,ptr_array);
ptr_array++;
}
第一种就相当于数组[index]的表达,没有使用到指针的移动,第二种原来指针变量是没有改变的,第三种是原来指针变量改变的,进行了自身的++,建议使用第二种,因为如果使用第三种,当一个循环完成后,指针指向最后一个地址,如果想要在遍历一次,不能直接在后边再次复制一遍这个代码,因为指针在进行++的时候,就指向别的地址了,打印出来的就不是想要的结果了,如图所示
int array[]={15,20,25,30,35};
int i;
int *ptr_array=array;
//赋值完毕后,就可以使用指针访问数组元素了
for(i=0;i<5;i++)
{
// 第三种
printf("第%d个元素的值为%d\t地址为:%p\n",i+1,*ptr_array,ptr_array);
ptr_array++;
}
printf("*************\n");
for(i=0;i<5;i++)
{
// 第三种
printf("第%d个元素的值为%d\t地址为:%p\n",i+1,*ptr_array,ptr_array);
ptr_array++;
}
其实这个问题也很好解决,那就是在循环之前,把指针进行重置
ptr_array=array;
后记
今天简单的把指针和数组的关系通过小例子进行了总结,其实C语言要想学好,看来真要研究一下计算机底层是如何工作的,因为C语言的强大之处就是足够的接近底层