嵌入式-C语言基础:指针偏移打印数组

在C语言中,数组名代表数组中首元素的地址,所以,下面两句获取数组的首地址是等价的:

复制代码
#include<stdio.h>

int  main()
{
    int a[5]={1,2,3,4,5};
    int *p=&a[0];
    int *p2=a;
    printf("地址p=%p\n",p);
    printf("地址p2=%p",p2);
    return 0;
}
复制代码

输出结果:

地址p=000000000061FDF0
地址p2=000000000061FDF0

根据指针地址偏移,可以打印数组

复制代码
#include<stdio.h>

int  main()
{
    int a[5]={1,2,3,4,5};
    int *p=&a[0];
    int *p2=a;
    printf("地址p=%p\n",p);
    printf("地址p2=%p\n",p2);
    printf("打印数组:\n");
    for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
    {
        printf("%d",*(p+i));//带上*表示取该地址的值
    }
    return 0;
}
复制代码

输出结果:

地址p=000000000061FDF0
地址p2=000000000061FDF0
打印数组:
12345

使用指针访问数组的效率是远远大于数组下标的访问效率。

也可以通过下面方法,将指针当作数组面名,通过下标法来访问:

复制代码
#include<stdio.h>

int  main()
{
    int a[5]={1,2,3,4,5};
    int *p=&a[0];
    int *p2=a;
    printf("地址p=%p\n",p);
    printf("地址p2=%p\n",p2);
    printf("打印数组:\n");
    for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
    {
        printf("%d",p[i]);//像数组一样访问
    }
    return 0;
}
复制代码

也可以通过下面的方法:

复制代码
#include<stdio.h>

int  main()
{
    int a[5]={1,2,3,4,5};
    int *p=&a[0];
    int *p2=a;
    printf("地址p=%p\n",p);
    printf("地址p2=%p\n",p2);
    printf("打印数组:\n");
    for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
    {
        printf("%d",*(a+i));//数组++
    }
    return 0;
}
复制代码

 但是不能对数组名++,编译会发生错误

复制代码
#include<stdio.h>

int  main()
{
    int a[5]={1,2,3,4,5};
    int *p=&a[0];
    int *p2=a;
    printf("地址p=%p\n",p);
    printf("地址p2=%p\n",p2);
    printf("打印数组:\n");
    for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
    {
        printf("%d",*a++);//数组++,会发生编译错误
    }
    return 0;
}
复制代码

数组++是禁止的,因为++相当于更改数组的地址,而数组地址是固定的,是一个常量,对它进行++操作是不允许的。

并且,在操作系统中,都用8个字节来表示一个地址:

#include<stdio.h>
int  main()
{
    printf("整型指针:%d\n",sizeof(int *));
    printf("字符型指针:%d\n",sizeof(char *));
    printf("浮点型指针:%d\n",sizeof(float *));
    return 0;
}

输出结果:

整型指针:8
字符型指针:8
浮点型指针:8

 

posted @   WellMandala  阅读(218)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示