嵌入式-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
嵌入式-C语言基础:指针偏移打印数组的更多相关文章
- 嵌入式-C语言基础:二维数组
二维数组的每个元素都是一个一维数组,例如int arr[2][3]={{1,2,3},{4,5,6}}; 下面通过几个例子来对二维数组进行深入了解:二维数组可以看作是一个父数组,他的每个元素都是一个一 ...
- 嵌入式-C语言基础:二维数组的地址写法
二维数组a的有关指针: 表示形式 含义 ...
- 嵌入式-C语言基础:指针数组(和数组指针区分开来)
指针数组:一个数组,若其元素均为指针类型的数据,称为指针数组,指针数组存放的是指针类型的数据,也就是指针数组的每个元素都存放一个地址.下面定义一个指针数组: int * p[4];//[]的优先级是比 ...
- 嵌入式-C语言基础:二级指针
二级指针:可以理解为指向指针的指针,存放的是指针变量的地址. 下面用一级指针来保存一个指针变量的地址: #include<stdio.h> int main() { int *p1; in ...
- 嵌入式-C语言基础:指针是存放变量的地址,那为什么要区分类型?
指针是存放变量的地址,那为什么要区分类型?不能所有类型的变量都用一个类型吗?下面用一个例子来说明这个问题. #include<stdio.h> int main() { int a=0x1 ...
- [Coursera][计算导论与C语言基础][Week 10]对于“数组应用练习”课后习题的思考题的一些想法
(首先,关于Honor Code,我咨询过了Help Center,分享课后练习的思考题的想法是可以的(注意不是代码),但要标明引用,引用格式来源于https://guides.lib.monash. ...
- C语言 字符串指针和字符串数组使用区别
字符串指针和字符串数组使用区别 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 ...
- 嵌入式-C语言基础:数组指针
定义一个数组指针,指向二维数组: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int (*p)[4];//定义二维指针数组 p=a;//指向二维数组 ...
- 嵌入式-C语言基础:通过结构体指针访问结构体数组
#include<stdio.h> #include<string.h> struct Student { char name[32]; int age; int height ...
随机推荐
- iOS WebRTC 点对点实时音视频流程介绍
前言 公司某个项目需要接入音视频即时通讯, 功能类似微信的拨打视频通话,语音通话的场景.那么对于音视频通讯会用到什么技术呢?没错,它就是 WebRTC . 什么是WebRTC WebRTC,名称源自网 ...
- Android、iOS平台RTMP/RTSP播放器实时音量调节
介绍移动端RTMP.RTSP播放器实时音量调节之前,我们之前也写过,为什么windows播放端加这样的接口,windows端播放器在多窗口大屏显示的场景下尤其需要,尽管我们老早就有了实时静音接口,相对 ...
- docker-compose总结
docker-compose.yml 样例: 各个标签的含义在注释里 version: '3' # 选择的docker-compose 版本 services: # 要编排的一组服务 fim-mysq ...
- 华南理工大学 Python第2章课后小测-2
1.(单选)下列符号中,有()个是Python的关键字.(1)if (2)lambda (3)not (4) For (5)None(6)from (7)True (8)fina ...
- GitHub desktop常见问题及解决办法
1.There are unresolved conflicts in the working directory. 问题出现:A台电脑push代码后,可能新建了分支,然后B电脑打开GitHub de ...
- vscode常用快捷键及插件
macOS 全局 Command + Shift + P / F1 显示命令面板 Command + P 快速打开 Command + Shift + N 打开新窗口 Command + W 关闭窗口 ...
- Markdowm基础语法的使用(typora)
Mackdown学习 一级标题:一个#加空格 回车 二级标题:两个#加空格 回车 以此类推... 一级标题(Ctrl+1) 二级标题(Ctrl+2) 三级标题(Ctrl+3) 四级标题(Ctrl+4) ...
- 给 SSH 启用二次身份验证
转载自:https://mp.weixin.qq.com/s/ssuhFbfaHxxzGmLg6Y2MjA 目前来说,二次验证(这里就不做过多解释了)是比较常用的安全手段,通过设置二次验证(谷歌或其他 ...
- ES小知识点
elasticsearch.yml配置文件 network.host: _site_ # network.host设置为"_site_",表明它绑定到我们的本地电脑的IP地址 di ...
- MongoDB一主一副本一仲裁搭建步骤
mkdir -p /opt/mongo/replica_sets/myrs_27017/log & mkdir -p /opt/mongo/replica_sets/myrs_27017/da ...