墨鱼崽崽


私信TA

用户名:dotcpp0714187

访问量:185

签 名:

等  级
排  名 9979
经  验 1060
参赛次数 0
文章发表 7
年  龄 23
在职情况 待业
学  校
专  业

  自我简介:

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

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

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分

2 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区