嵌入式c学习七

news2025/3/24 13:00:44

c语言指针:程序需要载入内存中运行,在32bit系统中内存地址的范围是:0x0000 0000-0xFFFF FFFF,内存大小为4GB,内存地址指的是内存单元的编号是固定的,本身就是一个整数,对于32bit系统,内存地址对应的编号是4字节的正整数

地址:c语言规定用户有权对对内存地址进行命名,地址编号本身也可以当初数据存在变量中

指针:c语言规定,用户打算定义一个变量来存储地址,则在定义变量前需要指明,变量中存的是一个地址,存储地址的变量叫做指针变量,指针变量定义格式:数据类型  *变量名;如int *p ==>p是变量名,*修饰变量p表示p是一个指针即p里面存储的数据是一个地址 ==> int 表示p指向的地址的内存下面的数据是整型

空指针:对指针变量初始化需要吧指针变量里面对应的内存设置为0,需要吧0强制转换成地址

0x00000000  ==> (void *)0x00000000 == c语言提供了宏定义NULL

保留区:linux系统的内存中有一部分内存是保留区,地址范围为:0x0000 0000-0x0804 8000,此区域用户无法访问,一旦访问就会出现段错误

int *p = NULL;  //对指针变量进行初始化,目的是防止野指针出现,避免段错误

#include <stdio.h>

int main()
{
	int data = 20;
	int *p = NULL;  //对指针进行初始化,避免野指针出现
	
	p = &data;      //p ==> &p ==> *(&p) == p,使用变量是操作系统默认先找到变量的地址(&),在间接访问地址里面的数据(*) 
	
	//通过变量名访问 
	data = 10;
	printf("data: %d\n", data); //10
	
	*(&data) = 20;
	printf("data: %d\n", data); //20  data == *(&data)
	
	//通过指针访问
	*p = 40;
	printf("data: %d\n", data); //40  p = &data ==> *p == *(&data) 
	
	return 0;
}

保留区地址用户是无法访问的,但可以定义指针指向这块空间,指针变量只能存储这个地址,不能间接访问该地址下的值,否则会段错误(Segmentation fault)

数组指针:int b[5]; int *p = b; 

#include <stdio.h>

int main()
{
	
	int a[5] = {1,2,3,4,5};
		
	for(int i=0; i<5; i++){
		printf("a[%d]=%d	", i, a[i]);  
	}
	printf("\n");
	
	int *p = a;                  //此处a表示数组首元素地址,即a==&a[0] 
	
	//通过数组下标访问
	a[0] = 10;
	printf("a[0]=%d\n", a[0]);   //10
	
	//通过指针访问
	*(p+1) = 20; 
	printf("*(p+1)=%d\n", a[1]); //20 p == a ==> *(p+1) ==*(a+1) == a[1]
	
	return 0;
}

 地址的运算:一般只能对地址进行 +- 运算,表示地址的偏移,偏移的单位取决于该地址下存储的数据的类型

#include <stdio.h>

int main()
{
	
	int a[5] = {1,2,3,4,5};
	
	printf("a的地址为:   %p\n", a);     //a表示数组首元素地址 
	printf("a+1的地址为: %p\n", a+1);   //a+1表示地址向后偏移一个数组元素单位即4字节 
	printf("&a+1的地址为: %p\n", &a+1);  //&a表示 整个数组地址,&a+1表示地址向后偏移一个数组单位即4*5=20字节 
		
	int *ptr = (int*)(&a+1);           
	printf("*(a+1)=%d\n", *(a+1));     //2  *(a+1) = a[1] = 2
	printf("*(ptr-1)=%d\n", *(ptr-1)); //5 

	return 0;
}

二维数组与指针

#include <stdio.h>

int main()
{
	
	int aa[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
	
	//单独从地址的值来说,aa==aa[0]==&aa[0][0]==&aa 
	printf("aa地址      %p\naa[0]地址   %p\naa[0][0]地址%p\n&aa地址     %p\n", aa, aa[0], &aa[0][0], &aa); 
	
	//aa表示数组首元素地址,即aa == &aa[0]
	printf("&aa[0]的地址: %p\naa的地址:     %p\n", &aa[0], aa); 
	
	printf("aa+1的地址:   %p\n", aa+1);   //aa+1表示地址从aa[0]偏移到aa[1],偏移aa[2]数组中一个元素的字节:4*5=20字节 
	     
	printf("&aa的地址:    %p\n\n", &aa);   //&aa表示整个数组的地址
	
	printf("&aa+1的地址:  %p\n\n", &aa+1);  //&aa+1,表示地址向后偏移一个数组单位即2*4*5=40字节 
	
 	
	int *ptr1 = (int*)(&aa +1);            //此时ptr1指向数组aa的后一个地址 
	
	printf("*(ptr1-1)=%d\n", *(ptr1-1));   //10 向后偏移一个整型元素aa[1][4]的值 
	
	int *ptr2 = (int*)(*(aa+1));           //此时ptr2表示aa[1]的地址,int*表示指向aa[1][0] 
	printf("*(ptr2-1)=%d\n", *(ptr2-1));   // 5  aa[0][4] 
	
	return 0;
}

二维数组的访问

#include <stdio.h>

int main()
{
	
	int aa[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
	
	for(int i=0; i<2; i++){
		for(int j=0; j<5; j++){
			printf("aa[%d][%d]=%d  ", i, j, aa[i][j]);
		}
		printf("\n");
	}
	
	//p变量名,*p表示p是指针,[5]表示p指向有5个元素的匿名数组,int表示指针指向的内存中数据为整型 
	int (*p)[5] = aa;  //将数组aa的首地址即&aa[0]存到指针变量p中
	
	//数组下标访问
	aa[0][0] = 10;    // aa[0][0] == *(aa[0]+0) == *aa[0] == *(&aa[0][0])
	printf("a[0][0]=%d\n", aa[0][0]); 
	
	//指针变量访问aa[1][2]
	//aa[1][2] == *(aa[1]+2) == *(*(aa+1)+2) ==>aa==&aa[0]==p ==>*(*(p+1)+2) 
	*(*(p+1)+2) = 80;
	printf("a[1][2]=%d\n", aa[1][2]); 
	 
	return 0;
}

指针数组:数组中每个元素都是指针,定义格式:数据类型   *数组名[元素个数];如:int *p[5];

二级指针:指针变量中存储的值,是另一个指针变量的地址

指针与数组的定义:int * (*p)[3][4]

p:表示变量p 

*p:表示变量p是一个指针,用于存放地址

[3]:表示指针p存储的地址下的数据类型是一个匿名数组,可以存放三个元素

[4]:表示匿名数组[3]中每个元素都是一个有4个元素的匿名数组

*:   表示匿名数组[4]中每个元素的类型是一个指针

int:表示[4]中存储的指针所指向的地址是int

	int *(*p)[2][3];   //运算符优先级()>[]>* 
	
	// *p     		  :表示p是一个指针存放的数据是地址
	// (*p)[2]        :表示p指针里面存放的地址,地址下面的数据类型为匿名数组[2]里面有两个元素
	// (*p)[2][3]     :表示匿名数组[2]里面的数据,类型是匿名数组[3]->里面有三个元素
	// *(*p)[2][3]    :表示匿名数组[3]里面的数据,类型是指针
	// int *(*p)[2][3]:表示匿名数组[3]里面存的地址,地址所下面存的数据类型为int 

二级指针定义格式:int data;  int *p1= &data;  int **p2 = &p1;==>*p2是一个指针存储的值为地址,*表示p1里面存的地址下面的值,还是指针

#include <stdio.h>

int main()
{
	int data = 10;		//定义整型变量 
	int *p1 = &data;	//定义指针变量存储data的地址 
	int **p2 = &p1;		//定义二级指针,存储指针p1的地址 
	
	//用变量名访问数据
	data = 20;
	printf("data=%d\n", data); 
	
	//用指针p1访问数据
	*p1 = 30;          //p1==&data ==>*p1 == *(&data) == data 
	printf("*p1=%d\n", data); 
	
	//用指针p2访问 
	**p2 = 40;		   //p2 == &p1 ==> *p2 == *(&p1) == p1 ==> **p2 ==*p1 == data
	printf("**p2=%d\n", data); 
	
	//一维数组形式访问
	p1[0] = 50;       //p1[0] == *(p1+0) == *p1 == data 
	printf("p1[0]=%d\n", data); 
	
	//二维数组形式访问
	p2[0][0] = 60;    // p2[0][0] == *(p2[0]+0) == *p2[0] == *(*(p2+0)) == **p2 == data 
	printf("p2[0][0]=%d\n", data); 	
	
	return 0;
}

练习:

#include <stdio.h>

int main()
{
	int buf[5] = {1,2,3,4,5};
	int *p = buf;
	
	printf("%d\n", *p++);  		//1:++后置,*p =buf[0]=1,结束后P指向a[1]的地址 
	printf("%d\n", (*p)++);		//2:++后置,*p=buf[1]=2,结束后p指向a[2]的地址 
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考通关利器:中级软件设计师结构化开发核心考点

简介&#xff1a; 作为国家软考中级认证的核心科目&#xff0c;“软件设计师” 结构化开发能力是职业进阶的黄金敲门砖。本模块聚焦考试大纲高频考点&#xff0c;深度解析需求建模、结构化分析方法&#xff08;SA/SD&#xff09;、模块设计原则、数据流图&#xff08;DFD&#…

【Linux】Hadoop-3.4.1的伪分布式集群的初步配置

配置步骤 一、检查环境 JDK # 目前还是 JDK8 最适合 Hadoop java -version echo $JAVA_HOME Hadoop hadoop version echo $HADOOP_HOME 二、配置SSH免密登录 Hadoop需要通过SSH管理节点&#xff08;即使在伪分布式模式下&#xff09; sudo apt install openssh-server …

楼宇自控系统的结构密码:总线与分布式结构方式的差异与应用

在现代建筑中&#xff0c;为了实现高效、智能的管理&#xff0c;楼宇自控系统变得越来越重要。它就像建筑的 智能管家&#xff0c;可自动控制照明、空调、通风等各种机电设备&#xff0c;让建筑运行更顺畅&#xff0c;还能节省能源成本。而在楼宇自控系统里&#xff0c;有两种关…

Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)

前言 近期在抠lerobot源码时&#xff0c;看到其封装了ALOHA ACT、diffusion policy、π0时&#xff0c;我就在想&#xff0c;lerobot其实可以再封装下idp3 我甚至考虑是否从我联合带的那十几个具身研究生中选几个同学做下这事&#xff0c;对他们也是很好的历练然当25年3.18日…

系统架构设计知识体系总结

1.技术选型 1.什么是技术选型&#xff1f; 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…

计划管理工具应该具备的能(甘特图)

在当今快节奏的项目管理环境中&#xff0c;高效地规划和跟踪项目进度是至关重要的。甘特图&#xff0c;作为项目管理领域的经典工具&#xff0c;以其直观的时间轴和任务分配方式&#xff0c;深受项目管理者的青睐。 随着数字化时代的到来&#xff0c;甘特图线上编辑器应运而生&…

简单实用!百度AI + Raphael AI = 免费生图

简单实用&#xff01;百度AI Raphael AI 免费生图 -- ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b55eda9141d34697b05db0cd60f62b75.png#pic_center) 第一步&#xff1a;下载或截取一些好看的图片当参考图片 第二步&#xff1a;用百度AI描述你想要的图片&…

2025-03-22 学习记录--C/C++-C 库函数 - getchar()

C 库函数 - getchar() ⭐️ C 标准库 - <stdio.h> &#xff08;一&#xff09;、函数声明 &#x1f36d; int getchar(void)从标准输入 stdin 获取一个字符&#xff08;一个无符号字符&#xff09;。 参数&#xff1a;&#x1f380; NA 返回值&#xff1a;&#x1f38…

APM 仿真遥控指南

地面站开发了一段时间了&#xff0c;由于没有硬件&#xff0c;所以一直在 APM 模拟器中验证。我们已经实现了 MAVLink 消息接收和解析&#xff0c;显示无人机状态&#xff0c;给无人机发送消息&#xff0c;实现一键起飞&#xff0c;飞往指定地点&#xff0c;降落&#xff0c;返…

BBR 和 CUBIC 对长肥管道的不同反应

有个关于 CUBIC(等一众 AIMD-based cc) 和 BBR 在长肥管道中的行为比较挺有趣&#xff0c;它们的表现竟然截然相反&#xff1a; CUBIC 流共存&#xff0c;RTT 越大&#xff0c;Goodput 越低&#xff1b;BBR 流共存&#xff0c;RTT 越大&#xff0c;Goodput 越高。 前一个被看…

架构师面试(十九):IM 架构

问题 IM 系统从架构模式上包括 【介绍人模式】和 【代理人模式】。介绍人模式也叫直连模式&#xff0c;消息收发不需要服务端的参与&#xff0c;即客户端之间直连的方式&#xff1b;代理人模式也叫中转模式&#xff0c;消息收发需要服务端进行中转。 下面关于这两类模式描述的…

Spring框架入门指南:从Hello World到IOC容器

第一章&#xff1a;Spring框架的介绍 1. Spring框架的概述 Spring是一个开放源代码的设计层面框架&#xff0c;它解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。 Spring是于2003 年兴起的一个轻量级的Java开发框架&…

嵌入式电路设计软件个人安装步骤分享

各位小伙伴大家好,今天给大家分享一个,电路设计软件的安装方法,希望对大家有所帮助。 一、下载【Multisim14.0安装包】: 链接:夸克网盘分享 提取码:kHSP 电脑安装Multisim14.0并且汉化 准备安装包以及汉化包双击“NI_Circuit_Design_Suite_14_0【海量免费资源:kebaiwan…

git | 回退版本 并保存当前修改到stash,在进行整合。[git checkout | git stash 等方法 ]

目录 一些常见命令&#xff1a; git 回退版本 一、临时回退&#xff08;不会修改历史&#xff0c;可随时回到当前版本&#xff09; 方法1&#xff1a;git checkout HEAD~1 二、永久回退&#xff08;改变分支指向&#xff09; 方法2&#xff1a;git reset 1. 保留修改&am…

【Java SE】单例设计模式

参考笔记&#xff1a;深入理解Java设计模式&#xff1a;单例模式及其饿汉式与懒汉式的对比,-CSDN博客 目录 1.什么是设计模式 2.经典设计模式 3.单例设计模式&#xff08;static属性/方法经典使用场景 &#xff09; 3.1 饿汉式单例模式 3.2 懒汉式单例模式 4.补充 1.什么…

安全守护:反光衣检测技术的革新之路

视觉分析助力船上工人反光衣检测 在现代工业生产与作业环境中&#xff0c;安全始终是首要考虑的因素。对于水上作业&#xff0c;如船舶维护、海上施工等场景&#xff0c;工人穿戴反光衣是预防事故、提高可见性的重要措施。然而&#xff0c;传统的人工检查方式不仅效率低下&…

OSCP准备靶场联系-Kioptrix 1

oscp 准备 Kioptrix 1 信息收集 ifconfig 确认自己的电脑ip&#xff0c;nmap收集通往段ip&#xff0c;确认靶机IP nmap 重点关注服务版本 nmap -sn 192.168.1.0/24 # 扫描网段内存活主机&#xff0c;不进行端口扫描[1,10](ref) nmap -sP 192.168.1.1 # 传统Ping扫描…

【工具变量】中国各地级市是否属于“信息惠民国家试点城市”匹配数据(2010-2024年)

数据来源&#xff1a;国家等12部门联合发布的《关于加快实施信息惠民工程有关工作的通知》 数据说明&#xff1a;内含原始文件和匹配结果&#xff0c;当试点城市在2014年及以后&#xff0c;赋值为1&#xff1b;试点城市在2014年之前或该城市从未实施信息惠民试点工程&#x…

深度学习 Deep Learning 第7章 深度学习的正则化

深度学习 第7章 深度学习的正则化 章节概述 正则化技术是深度学习中防止过拟合、提升模型泛化能力的核心手段。本章深入探讨了深度学习中的正则化技术&#xff0c;旨在解决模型在新数据上的泛化能力问题。正则化是通过在学习算法中引入额外的约束或惩罚项&#xff0c;来减少模…

使用DeepSeek翻译英文科技论文,以MarkDown格式输出,使用Writage 3.3.1插件转换为Word文件

一、使用DeepSeek翻译英文科技论文&#xff0c;以MarkDown格式输出 以科技论文“Electrical Power System Sizing within the Numerical Propulsion System Simulation”为例。 关于Writage 3.3.1的进一步了解&#xff0c;可发送邮件至邮箱pyengine163.com. 首先&#xff0c;打…