嵌入式C语言学习——基于Linux与GCC(二)

系列文章目录

一.C语言常用关键字及运算符操作


文章目录

  • 系列文章目录
  • 内存四区
  • 指针
    • 指针概述
    • 指针 + 修饰符
      • const
      • volatile
      • typedef
    • 指针+运算符
    • 多级指针
  • 数组
    • 数组空间
    • 字符空间及地址
  • 结构体、共用体
    • 定义、字节对齐
    • 位域
  • 内存分布图
  • 段错误分析


内存四区

C/C++语言的内存四区(栈区,堆区,全局区,代码区)(附图详解)
在这里插入图片描述

指针

指针概述

指针:内存类型资源地址、门牌号的代名词
指针变量:存放指针这个概念的盒子/存放地址
C语言*p、p以及&p的区别

简单来说 “ * ”是解引用操作符 “ & ”是取地址运算符
p存放的是地址,而*p是让程序去p储存的那个地址中取出数据,&p就是取指针p的地址

补; 在C 语言中 * 号有三个用途,分别是:
1.乘号,用做乘法运算,例如5*6
2.申明一个指针,在定义指针变量时使用,例如int *p;
3.间接运算符,取得指针所指向的内存中的值,例如printf(“%d”,*p);

c语言编译器对指针这个特殊的概念,有两个疑问?
1.分配一个盒子,盒子要多大?
在32bit的系统中,指针就4个字节,(可以表示2^32个地址,4GB的内存空间)
2.盒子里存放的的地址,所指向的内存的读取方法是什么?
char *p 一次读取1字节,8bit
int *p; 一次读取4字节,32bit
在这里插入图片描述

eg1:
#include<stdio.h>
int main()
{int *p_1;int *p_2;printf("the p_1 is %u,the p_2 is %u",sizeof(p_1),sizeof(p_2))	
}
结果:the p_1 is 8,the p_2 is 8   (64位处理器,8字节)

p1 = 0x1122;在32位CPU中,这个地址是不合法的
指针指向内存空间,一定要保证合法性。

eg2:
#include<stdio.h>
int main()
{int a = 0x12345678;int *p_1;p_1 = &a; //a的首地址(低位地址)赋给 p_1printf("the p_1 is %x\n",*p_1);
}
结果:the p_1 is 12345678
eg3:
#include<stdio.h>
int main()
{int a = 0x12345678;int *p_1;p_1 = &a; //a的首地址(低位地址)赋给 p_1printf("the p_1 is %x\n",*p_1); //%x是16进制输出
}
结果:the p_1 is 78

0x12是高位
在这里插入图片描述
0x78是低位

#include<stdio.h>
int main()
{float a = 1.2;char *p_1;p_1 = &a;printf("the p_1 is %x\n",*p_1);
}结果:the p_1 is ffffff9a //输出不是9a
修改:unsigned char *p_1 即可  //printf()把一些位当成了符号位

指针 + 修饰符

内存属性:
1.内存操作的大小
2.内存的可读可写性
指针指向的内存属性是什么?弄错会导致段错误。

const

常量、只读、不能变
char *p;

const char *p;     //地址指向的内存只读不可写,是字符串。并且注意地址是可变的。
char const *p;
char * const p;   //对固定地址进行读写,是硬件资源,地址固定,LCD
char *p const
const char * const p;    //地址和内容都不可变,对固定的地址只读,ROM
eg:
char *p = "hello world\n"; 编译器看到字符串默认是const型,空间只读不可写,字符串首地址给p
printf("the one is %x\n",*p);看字符串的第一个字符的ascii码
*p = 'a';  向p的地址指向的内存空间中进行写操作//会造成段错误、Segmentation fault、指针指向的内容被非法访问
printf("the %s\n",p);  //输出字符串

字符串是以地址的方式储存的,所以打印字符产只需要输入首地址,读到结束符\0结束

注:int printf(const char *format, ...);
上面例子第一行应该改为 const char *p = "hello world\n"
此时编译器会给出警告,并不会给出段错误。
char buf[] = {"hello world!\n"};  {}中的内容在静态区,只读不可写,但是将其值逐个赋给buf[],储存在可读写的区域。
char *p_2 = buf;//buf的首地址给p_2
*p_2 = 'a'; 将首地址中的内容改为'a'
printf("the %s\n",p_2);
结果:the aello world

volatile

防止优化指向内存地址
目的是去看硬件设备(eg:键盘)中的真实值,

volatile char *p;
while(*p == 0x10);
xxxx;

typedef

别名
char *p;
什么类型 变量名称;

char *name_t;     //name_t是一个指针,指向了一个char类型的内存
------
typedef char *name_t;  //name_t是一个指针类型的名称,指向了一个char类型的内存
name_t abc;

指针+运算符

+、-、++、–
指针的加法运算,实际上加的是一个单位,单位的大小可以使用sizeof()

 int *p =0x12;p+1 -->[0x12+1*(sizeof(*p)) ] -->0x16---------------------------------------char *p =0x12;p+1 -->[0x12+1*(sizeof(*p)) ] -->0x13
p++ / p- -;  p 的地址自加1,并将新的地址更新到p
与p+1的区别:p+1只查看不更新

[ ]
变量名[n]
n:ID 标签
地址内容的标签访问方式

p+n 得到的是以p为基地址加n个单位得到的地址
p[n] 得到的是以p为基地址加n个单位得到的地址中的内容

多级指针

数组

数组空间

字符空间及地址

结构体、共用体

定义、字节对齐

位域

内存分布图

段错误分析

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

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

相关文章

Django模板(四)

一、include标签 加载一个模板,并在当前上下文中进行渲染。这是一种在模板中 “包含” 其他模板的方式 简单的理解:在当前模板中引入另外一个模板内容 1.1、使用方法 模板名称可以是变量,也可以是单引号或双引号的硬编码(带引号)的字符串 {% include "foo/bar.ht…

ALBEF算法解读

ALBEF论文全名Align before Fuse: Vision and Language Representation Learning with Momentum Distillation&#xff0c;来自于Align before Fuse&#xff0c;作者团队为Salesforce Research。 论文地址&#xff1a;https://arxiv.org/pdf/2107.07651.pdf 论文代码&#xff1…

美国首届生成式人工智能与法律研讨(上)

美国首届生成式人工智能与法律研讨(上) 文章目录 美国首届生成式人工智能与法律研讨(上)前言一、引言二、生成式AI对法律的影响三、生成式AI与法律的跨学科研究3.1 确定和定义跨学科术语3.2 构建有价值的隐喻3.3 理解不断发展的商业模式四、生成式AI的独特性4.1 从执行狭义…

GO框架基础 (三)、xorm库

xorm介绍 官网&#xff1a;https://xorm.io/ git文档&#xff1a;https://github.com/go-xorm/xorm xorm 是一个 Go 语言的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它提供了一种简单、高效的方式来将 Go 语言中的结构体与数据库表进行映射&#xff0c;并提供了…

[OpenAI]继ChatGPT后发布的Sora模型解析与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

【RHCE】shell条件测试练习

目录 1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查次磁盘剩余空间。 2、判断web服务是否运行 3、使用curl命令访问第二题的web服务&#xff0c;看能否正常访问&#xff0c;如果能正常访问&#xff0c;…

计算机网络-H3C网络端口基础信息与配置

一、网络端口基础信息与配置 这个主要是记录一下关于华三的交换机、防火墙和路由器的物理接口的一些基础知识与配置。 1.1 命名规范 H3C的端口命名主要是根据端口的速率来进行区分的。基本都是千兆速率往上的&#xff0c;百兆的端口比较多用于二层傻瓜交换机或者不能CLI管理的。…

《戴森球计划》好玩吗?《戴森球计划》怎么在苹果电脑上安装 戴森球计划攻略 Mac游戏推荐

《戴森球计划》是一款具有强大现实科学基础的模拟策略游戏&#xff0c;玩家的目标是构建能源效率极高的戴森球以解决能源问题。游戏的背景设定启发于科幻作品中的戴森球概念。游戏采用逼真的物理模拟&#xff0c;玩家需要合理规划资源&#xff0c;以应对复杂的能源危机。那么《…

【LeetCode+JavaGuide打卡】Day20|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

学习目标&#xff1a; 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先 学习内容&#xff1a; 530.二叉搜索树的最小绝对差 题目链接&&文章讲解 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值…

C语言easyx飞机大战源码+素材

飞机大战游戏完整源码 一、项目背景 在数字娱乐飞速发展的今天,电子游戏已经成为许多人生活中不可或缺的一部分。飞机大战,作为一款经典的射击游戏,以其简单易上手、刺激好玩的特点,深受玩家的喜爱。本项目旨在利用EasyX图形库,为玩家呈现一个全新的飞机大战游戏体验。 …

【计算机网络】网络编程套接字UDP服务器客户端的简单模拟

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 前置知识1.1 源IP和目的IP1.2 端口号1.3 TCP协议和UDP协议初识1.4 网络字节序1.5 …

C# OpenCvSharp DNN Low Light image Enhancement

目录 介绍 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN Low Light image Enhancement 介绍 github地址&#xff1a;https://github.com/zhenqifu/PairLIE 效果 模型信息 Model Properties ------------------------- ------------------------------------------…

文献学习-1-Continuum Robots for Medical Interventions

Chapt 5. 连续体机构分析 5.1 文献学习 5.1.1 Continuum Robots for Medical Interventions Authors: PIERRE E. DUPONT , Fellow IEEE, NABIL SIMAAN , Fellow IEEE, HOWIE CHOSET , Fellow IEEE, AND CALEB RUCKER , Member IEEE 连续体机器人在医学上得到了广泛的应用&a…

卷积神经网络的基本结构

卷积神经网络的基本结构 与传统的全连接神经网络一样&#xff0c;卷积神经网络依然是一个层级网络&#xff0c;只不过层的功能和形式发生了变化。 典型的CNN结构包括&#xff1a; 数据输入层&#xff08;Input Layer&#xff09;卷积层&#xff08;Convolutional Layer&#x…

Avalonia学习(二十四)-系统界面

目前项目式练习&#xff0c;界面内容偏多&#xff0c;所以不给大家贴代码了&#xff0c;可以留言交流。此次为大家展示的是物联项目的例子&#xff0c;仅仅是学习&#xff0c;我把一些重点列举一下。 界面无边框 以前的样例主要是通过实现控件来完成的&#xff0c;前面已经有窗…

Linux命令:stat命令

目录 1 简介2 说明3 实例-L&#xff1a;显示链接指向的文件的信息-f&#xff1a;显示文件系统信息-t&#xff1a;以简洁的形式输出 1 简介 stat命令&#xff1a;显示文件或文件系统的状态 2 说明 使用&#xff1a;stat [OPTION]… FILE 常用选项&#xff1a; -L, --derefer…

c语言游戏实战(9):球球大作战

前言&#xff1a; 这款简易版的球球大作战是一款单人游戏&#xff0c;玩家需要控制一个小球在地图上移动&#xff0c;吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写&#xff0c;旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前&#xf…

新算法UoT助力AI提问——主动寻求信息,任务完成率提高57.8%

引言&#xff1a;信息寻求在不确定性环境中的重要性 在不确定性环境中&#xff0c;信息寻求的能力至关重要。在许多实际应用中&#xff0c;如医学诊断和故障排除&#xff0c;解决任务所需的信息并非一开始就给出&#xff0c;而需要通过提问后续问题来主动寻求&#xff08;例如…

使用AndroidStudio调试Framework

1.前言 最近在工作过程中&#xff0c;涉及到FW的一些修改&#xff0c;比如PhoneWindowManager&#xff0c;只能通过加日志看打印的方式查看一些内容&#xff0c;比较低效&#xff0c;所以想了解一下FW的调试方式&#xff0c;后来发现AS就可以调试FW.我平时都是在Docker服务器编…

K8S部署MySQL主从环境

1.创建mysql主从环境的命名空间 [rootk8s-master1 mysql]# kubectl create ns mysql namespace/mysql created2.创建master的pvc [rootk8s-master1 mysql]# cat mysql-master-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: mysql-pvcnamespace: mysql…