嵌入式-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 ...
随机推荐
- 「学习笔记」单调队列优化dp
目录 算法 例题 最大子段和 题意 思路 代码 修剪草坪 题意 思路 代码 瑰丽华尔兹 题意 思路 代码 股票交易 题意 思路 代码 算法 使用单调队列优化dp 废话 对与一些dp的转移方程,我们可以 ...
- R数据分析:用R建立预测模型
预测模型在各个领域都越来越火,今天的分享和之前的临床预测模型背景上有些不同,但方法思路上都是一样的,多了解各个领域的方法应用,视野才不会被局限. 今天试图再用一个实例给到大家一个统一的预测模型的做法框 ...
- Java接口自动化测试框架系列(一)自动化测试框架
一.什么是自动化测试 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程. 通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例一步步执行测试,得到实际结果与期望结果的比较. 为了节省 ...
- 餐饮行业SRM案例:方正璞华"采云链"携手和府捞面
方正璞华在与和府捞面的项目中,帮助整合采购系统,系统化管理供应商,优化采购流程和数据分析,建立储备知识库. 项目背景 企业介绍 ◇ 和府捞面成立于2012年,是国内中式面食头部品牌.自2013年首 ...
- [报错]-NameError: name 'NAN' is not defined
部分数据输出为NaN,处理这部分异常数据使用isnan()函数 from math import isnan isnan(z) 参考: https://www.cnblogs.com/itdyb/p/ ...
- js中的对象和数组的创建
<!DOCTYPE html><html><head> <title>获取控制</title> <meta charset=" ...
- stm32fxx_hal_i2c.c解读之HAL_I2C_Mem_Write
HAL_I2C_Mem_Write()函数位于stm32fxx_hal_i2c.c文件的2432行,源代码对该函数的解释如下图 HAL_StatusTypeDef HAL_I2C_Mem_Write( ...
- 永恒之蓝(MS17-010)漏洞复现
1. 漏洞介绍 永恒之蓝: 恒之蓝是指2017年4月14日晚,黑客团体Shadow Brokers(影子经纪人)公布一大批网络攻击工具,其中包含"永恒之蓝"工具,"永恒之 ...
- redhat替换yum源时redhat.repo无法删除或禁用的问题
rhel7.3系统,在替换自带的repo源时发现无论是将redhat.repo重命名还是删除,在执行yum命令后总是自动又生成redhat.repo得问题,导致替换的CentOS-Base.repo, ...
- 第六章:Django 综合篇 - 2:核心配置项
Django的默认配置文件中,包含上百条配置项目,其中很多是我们'一辈子'都不碰到或者不需要单独配置的,这些项目在需要的时候再去查手册. 强调:配置的默认值不是在settings.py文件中!不要以为 ...