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

  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5. int a[5]={1,2,3,4,5};
  6. int *p=&a[0];
  7. int *p2=a;
  8. printf("地址p=%p\n",p);
  9. printf("地址p2=%p",p2);
  10. return 0;
  11. }

输出结果:

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

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

  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5. int a[5]={1,2,3,4,5};
  6. int *p=&a[0];
  7. int *p2=a;
  8. printf("地址p=%p\n",p);
  9. printf("地址p2=%p\n",p2);
  10. printf("打印数组:\n");
  11. for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
  12. {
  13. printf("%d",*(p+i));//带上*表示取该地址的值
  14. }
  15. return 0;
  16. }

输出结果:

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

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

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

  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5. int a[5]={1,2,3,4,5};
  6. int *p=&a[0];
  7. int *p2=a;
  8. printf("地址p=%p\n",p);
  9. printf("地址p2=%p\n",p2);
  10. printf("打印数组:\n");
  11. for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
  12. {
  13. printf("%d",p[i]);//像数组一样访问
  14. }
  15. return 0;
  16. }

也可以通过下面的方法:

  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5. int a[5]={1,2,3,4,5};
  6. int *p=&a[0];
  7. int *p2=a;
  8. printf("地址p=%p\n",p);
  9. printf("地址p2=%p\n",p2);
  10. printf("打印数组:\n");
  11. for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
  12. {
  13. printf("%d",*(a+i));//数组++
  14. }
  15. return 0;
  16. }

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

  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5. int a[5]={1,2,3,4,5};
  6. int *p=&a[0];
  7. int *p2=a;
  8. printf("地址p=%p\n",p);
  9. printf("地址p2=%p\n",p2);
  10. printf("打印数组:\n");
  11. for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
  12. {
  13. printf("%d",*a++);//数组++,会发生编译错误
  14. }
  15. return 0;
  16. }

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

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

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

输出结果:

整型指针: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. iOS WebRTC 点对点实时音视频流程介绍

    前言 公司某个项目需要接入音视频即时通讯, 功能类似微信的拨打视频通话,语音通话的场景.那么对于音视频通讯会用到什么技术呢?没错,它就是 WebRTC . 什么是WebRTC WebRTC,名称源自网 ...

  2. Android、iOS平台RTMP/RTSP播放器实时音量调节

    介绍移动端RTMP.RTSP播放器实时音量调节之前,我们之前也写过,为什么windows播放端加这样的接口,windows端播放器在多窗口大屏显示的场景下尤其需要,尽管我们老早就有了实时静音接口,相对 ...

  3. docker-compose总结

    docker-compose.yml 样例: 各个标签的含义在注释里 version: '3' # 选择的docker-compose 版本 services: # 要编排的一组服务 fim-mysq ...

  4. 华南理工大学 Python第2章课后小测-2

    1.(单选)下列符号中,有()个是Python的关键字.(1)if    (2)lambda  (3)not   (4) For   (5)None(6)from  (7)True   (8)fina ...

  5. GitHub desktop常见问题及解决办法

    1.There are unresolved conflicts in the working directory. 问题出现:A台电脑push代码后,可能新建了分支,然后B电脑打开GitHub de ...

  6. vscode常用快捷键及插件

    macOS 全局 Command + Shift + P / F1 显示命令面板 Command + P 快速打开 Command + Shift + N 打开新窗口 Command + W 关闭窗口 ...

  7. Markdowm基础语法的使用(typora)

    Mackdown学习 一级标题:一个#加空格 回车 二级标题:两个#加空格 回车 以此类推... 一级标题(Ctrl+1) 二级标题(Ctrl+2) 三级标题(Ctrl+3) 四级标题(Ctrl+4) ...

  8. 给 SSH 启用二次身份验证

    转载自:https://mp.weixin.qq.com/s/ssuhFbfaHxxzGmLg6Y2MjA 目前来说,二次验证(这里就不做过多解释了)是比较常用的安全手段,通过设置二次验证(谷歌或其他 ...

  9. ES小知识点

    elasticsearch.yml配置文件 network.host: _site_ # network.host设置为"_site_",表明它绑定到我们的本地电脑的IP地址 di ...

  10. MongoDB一主一副本一仲裁搭建步骤

    mkdir -p /opt/mongo/replica_sets/myrs_27017/log & mkdir -p /opt/mongo/replica_sets/myrs_27017/da ...