根据前面指针的学习,我们会发现,指针跟数组有些相似的地方。

这里我们首先引入一个知识点

C语言规定:数组名a是指针常量,它代表的是数组的首地址,即数组第一个元素a[0]的首地址。

#include<stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};
    printf("数组a的首地址为:%p\n", a);//这三个是等价的
    printf("\n");
    printf("数组a的首地址为:%p\n", &a);
    printf("\n");
    printf("数组a的首地址为:%p\n", &a[0]);
    printf("\n");
    return 0;
}

a+i就是a[i]的地址,即a+i与&a[i]等价。数组元素a[i]的地址&a[i]称为a[i]的指针(因为地址就是指针)。)所以a+i又称为指向a[i]的指针,简称a+i指向a[i]。

这一段很抽象,我们画一张表格理解一下。

指针地址元素
a0x01a[0]
a+10x02a[1]
a+20x03a[2]
a+30x04a[3]
a+40x05a[4]
#include<stdio.h>
int main()
{
    int a[5] = {1,2,3,4,5};
    for (int i = 0; i < 5; i++)//这两个for循环是等价的
    {
        printf("a[%d]的地址为:%p\n", i, &a[i]);
    }
    printf("\n");
    for (int i = 0; i < 5; i++)
    {
        printf("a[%d]的地址为:%p\n", i, a+i);
    }
    return 0;
}

那么既然数组有这种特性,我们该如何把指针与数组联系起来呢?

首先,我们将指针变量p指向数组a的首地址。此时a+i也就等于p+i,即&a[i]等价与p+i。

#include<stdio.h>
int main()
{
    int a[5] = {1,2,3,4,5};
    int* p = a;//定义指针变量p指向数组a的首地址
    for (int i=0; i < 5; i++)//与上述两个for循环等价
    {
        printf("a[%d]的地址为:%p\n",i,p+i);
    }
    return 0;
}

我们已经知道了地址,该如何输出值呢?

#include<stdio.h>
int main()
{
    int a[5] = { 1,2,3,4,5 };
    int* p = a;//定义指针变量p指向数组a的首地址
    for (int i = 0; i < 5; i++)//数组名下标,以下4种for循环都等价
    {
        printf("a[%d]=%d\n", i, a[i]);
    }
    printf("\n");
    for (int i = 0; i < 5; i++)
    {
        printf("a[%d]=%d\n", i, *(a + i));//数组名指针
    }
    printf("\n");
    for (int i = 0; i < 5; i++)
    {
        printf("a[%d]=%d\n", i, *(p+i));//指针变量指针
    }
    printf("\n");
    for (int i = 0; i < 5; i++)
    {
        printf("a[%d]=%d\n", i, p[i]);//指针变量下标
    }
    return 0;
}

总共有如上四种方法,注意观察一下时间,比比时间复杂度上谁更快哦!

点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论