在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

嵌入式-C语言基础:指针偏移打印数组的更多相关文章

  1. 嵌入式-C语言基础:二维数组

    二维数组的每个元素都是一个一维数组,例如int arr[2][3]={{1,2,3},{4,5,6}}; 下面通过几个例子来对二维数组进行深入了解:二维数组可以看作是一个父数组,他的每个元素都是一个一 ...

  2. 嵌入式-C语言基础:二维数组的地址写法

    二维数组a的有关指针: 表示形式                                含义                                                   ...

  3. 嵌入式-C语言基础:指针数组(和数组指针区分开来)

    指针数组:一个数组,若其元素均为指针类型的数据,称为指针数组,指针数组存放的是指针类型的数据,也就是指针数组的每个元素都存放一个地址.下面定义一个指针数组: int * p[4];//[]的优先级是比 ...

  4. 嵌入式-C语言基础:二级指针

    二级指针:可以理解为指向指针的指针,存放的是指针变量的地址. 下面用一级指针来保存一个指针变量的地址: #include<stdio.h> int main() { int *p1; in ...

  5. 嵌入式-C语言基础:指针是存放变量的地址,那为什么要区分类型?

    指针是存放变量的地址,那为什么要区分类型?不能所有类型的变量都用一个类型吗?下面用一个例子来说明这个问题. #include<stdio.h> int main() { int a=0x1 ...

  6. [Coursera][计算导论与C语言基础][Week 10]对于“数组应用练习”课后习题的思考题的一些想法

    (首先,关于Honor Code,我咨询过了Help Center,分享课后练习的思考题的想法是可以的(注意不是代码),但要标明引用,引用格式来源于https://guides.lib.monash. ...

  7. C语言 字符串指针和字符串数组使用区别

    字符串指针和字符串数组使用区别 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 ...

  8. 嵌入式-C语言基础:数组指针

    定义一个数组指针,指向二维数组: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int (*p)[4];//定义二维指针数组 p=a;//指向二维数组 ...

  9. 嵌入式-C语言基础:通过结构体指针访问结构体数组

    #include<stdio.h> #include<string.h> struct Student { char name[32]; int age; int height ...

随机推荐

  1. 微服务网关Gateway实践总结

    有多少请求,被网关截胡: 一.Gateway简介 微服务架构中,网关服务通常提供动态路由,以及流量控制与请求识别等核心能力,在之前的篇幅中有说过Zuul组件的使用流程,但是当下Gateway组件是更常 ...

  2. 输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。

    `void swap(int *a,int *b,int c){ if(a < *b){ int temp = *a; //防止temp没有初始化 随机存放地址指向系统工作区间 可以对temp初 ...

  3. Docker 入门指南

    Docker 入门指南 目录 基础概念 安装教程 基本操作 常用安装 构建操作 容器编排 壹.基础概念 什么是Docker? Docker是基于Go开发的应用容器引擎,属于 Linux 容器的一种封装 ...

  4. IO_对象流

    对象流 对象的本质是用来组织和存储数据的,对象本身也是数据.那么,能不能将对象存储到硬盘上的文件中呢?能不能将对象通过网络传输到另一个电脑呢?我们可以通过序列化和反序列化实现. java对象的序列化和 ...

  5. Kafka开启SASL认证 【windowe详细版】

    一.JAAS配置 Zookeeper配置JAAS zookeeper环境下新增一个配置文件,如zk_server_jass.conf,内容如下: Server { org.apache.kafka.c ...

  6. 【项目实战】CNN手写识别复杂模型的构造

    感谢视频教程:https://www.bilibili.com/video/BV1Y7411d7Ys?p=11 这里开一篇新博客不仅仅是因为教程视频单独出了1p,也是因为这是一种代码编写的套路,特在此 ...

  7. 【项目实战】用Pytorch实现线性回归

    视频教程:https://www.bilibili.com/video/BV1Y7411d7Ys?p=5 准备数据 首先配置了环境变量,这里使用python3.9.7版本,在Anaconda下构建环境 ...

  8. Python微服务实战

    文档地址:https://www.qikqiak.com/tdd-book/ GitHub地址:https://github.com/cnych/flask-microservices-users 源 ...

  9. MongoDB集群搭建---副本和分片(伪集群)

    参考地址:https://blog.csdn.net/weixin_43622131/article/details/105984032 已配置好的所有的配置文件下载地址:https://files. ...

  10. 「Tubian」Tubian0.41!支持Windows QQ微信!

    Tubian 0.42已发布:https://www.cnblogs.com/tubentubentu/p/16745926.html Sourceforge.net下载:https://source ...