嵌入式-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 ...
随机推荐
- 【java】学习路线14-抽象类、多态
/*抽象类 abstractabstract class A{ }注意abstract类中不一定需要有abstract方法但是有abstract方法的类中,该类一定是abstract方法抽象类不 ...
- 校园网跨网段共享文件Samba+SSH
Introduction This tutorial contains screenshots for the English version of Windows 10. Separate inst ...
- 如何从零开始参与 Apache 顶级开源项目?| 墙裂推荐
写在开头 从 2021 开始,有一个很有意思的说法经常在各大技术媒体或开源论坛中出现,「开源正在吞噬一切」.不论是否言过其实,从一个行业从业者的切身感知来看,开源确实从少数极客的小众文化成为主流的 ...
- 在Winform开发中,我们使用的几种下拉列表展示字典数据的方式
在Winform开发中中,我们为了方便客户选择,往往使用系统的字典数据选择,毕竟选择总比输入来的快捷.统一,一般我们都会简单封装一下,以便方便对控件的字典值进行展示处理,本篇随笔介绍DevExpres ...
- 完整的WindowsServer服务器系统初始化配置、安全策略加固和基线检查脚本等保2.0适用
转载自:https://www.bilibili.com/read/cv14326780?spm_id_from=333.999.0.0 0x00 前言简述 最近单位在做等保测评,由于本人从事安全运维 ...
- Helm包管理
Helm Kubernetes 包管理工具 Helm 可以帮助我们管理 Kubernetes 应用程序 - Helm Charts 可以定义.安装和升级复杂的 Kubernetes 应用程序,Char ...
- kubeadm join 命令执行流程
- 从Spring Cloud微服务视角理解Kubernetes
- vue+element-ui后台管理系统模板
vue+element-ui后台管理系统模板 前端:基于vue2.0+或3.0+加上element-ui组件框架 后端:springboot+mybatis-plus写接口 通过Axios调用接口完成 ...
- 消除两个inline-block元素之间的间隔
发现问题 两个inline-block元素之间的间隔.如下图 期望 消除两个inline-block元素之间的间隔. 解决方法 1.父元素字体大小设置为0 间隔的形成是非元素标签形成的 /** 方案1 ...