带你认识指针(二)——指针与数组

前言

       接着上篇博客说,上篇博客我们已经知道了什么是指针,也明白了他的用途,这次我们就来看看指针和数组之间有什么奇妙的关系


数组和指针是一对好基友


        我们都知道数组是存储在一块连续的存储空间中,也就是他可以表示一块连续的内存,我们需要得到数组中的某个元素,可以利用数组的下标,还可以如何得到呢?

        指针可以操作地址,所以说,我们完全可以用指针来获取到数组的元素,甚至对数组元素进行修改, 可以看出数组和指针其实是一对好基友,他们非常相似,只不过适用的范围不同,指针使用的范围跟数组下标相比,当然要广的多。


数组名也是指针?

      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语言的强大之处就是足够的接近底层


评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值