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

news2024/12/27 19:37:27

系列文章目录

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


文章目录

  • 系列文章目录
  • 内存四区
  • 指针
    • 指针概述
    • 指针 + 修饰符
      • const
      • voliatile
      • 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_1
        printf("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_1
        printf("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

voliatile

typedef

指针+运算符

多级指针

数组

数组空间

字符空间及地址

结构体、共用体

定义、字节对齐

位域

内存分布图

段错误分析

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

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

相关文章

LabVIEW伺服阀动静态测试系统

LabVIEW伺服阀动静态测试系统 基于LabVIEW开发了一套伺服阀动静态测试系统&#xff0c;提高伺服阀在电液伺服控制系统中的性能测试精度和效率。通过设计合理的液压系统、电控系统及软件系统&#xff0c;实现了伺服阀的动态和静态特性测试&#xff0c;采用流量-压力双闭环稳态控…

CSS之BFC

BFC概念 BFC&#xff08;Block Formatting Context&#xff09;即块级格式化上下文&#xff0c;是Web页面的可视CSS渲染的一部分。它是一个独立的渲染区域&#xff0c;让其中的元素在布局上与外部的元素互不影响。简单来说&#xff0c;BFC提供了一个环境&#xff0c;允许内部的…

【51单片机】初学者必读的一文【探究定时计数器与中断系统是如何配合起来的?】(9)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

AI工具导航网站介绍

给大家介绍一个AI工具导航网站&#xff1a;https://www.ainav.net/&#xff0c;里面有多种AI工具及开源AI应用。

Qt:自定义信号,信号emit,传参问题,信号槽与moc

一、自定义信号&#xff0c;信号emit 1、自定义信号 在头文件中 加入signals&#xff1a; 就可以编写信号 2、emit emit的作用是通知信号发生 二、跨UI控件传参 每次按Dialog添加按钮主控件数字会增长 // .h private slots:void on_btnAdd_clicked(); signals:void sign…

SelfAttention|自注意力机制ms简单实现

自注意力机制学习有感 观看b站博主的讲解视频以及跟着他的pytorch代码实现mindspore的自注意力机制&#xff1a;up主讲的很好&#xff0c;推荐入门自注意力机制。 import mindspore as ms import mindspore.nn as nn from mindspore import Parameter from mindspore import …

每日五道java面试题之java基础篇(九)

目录&#xff1a; 第一题 你们项⽬如何排查JVM问题第二题 ⼀个对象从加载到JVM&#xff0c;再到被GC清除&#xff0c;都经历了什么过程&#xff1f;第三题 怎么确定⼀个对象到底是不是垃圾&#xff1f;第四题 JVM有哪些垃圾回收算法&#xff1f;第五题 什么是STW&#xff1f; 第…

Spring Boot 笔记 017 创建接口_新增文章

1.1实体类增加校验注释 1.1.1 自定义校验 1.1.1.1 自定义注解 package com.geji.anno;import com.geji.validation.StateValidation; import jakarta.validation.Constraint; import jakarta.validation.Payload; import jakarta.validation.constraints.NotEmpty;import jav…

(03)Hive的相关概念——分区表、分桶表

目录 一、Hive分区表 1.1 分区表的概念 1.2 分区表的创建 1.3 分区表数据加载及查询 1.3.1 静态分区 1.3.2 动态分区 1.4 分区表的本质及使用 1.5 分区表的注意事项 1.6 多重分区表 二、Hive分桶表 2.1 分桶表的概念 2.2 分桶表的创建 2.3 分桶表的数据加载 2.4 …

kali无线渗透之用wps加密模式破解出wpa模式的密码12

WPS(Wi-Fi Protected Setup&#xff0c;Wi-Fi保护设置)是由Wi-Fi联盟推出的全新Wi-Fi安全防护设定标准。该标准推出的主要原因是为了解决长久以来无线网络加密认证设定的步骤过于繁杂之弊病&#xff0c;使用者往往会因为步骤太过麻烦&#xff0c;以致干脆不做任何加密安全设定&…

飞天使-k8s知识点17-kubernetes实操2-pod探针的使用

文章目录 探针的使用容器探针启动实验1-启动探针的使用-startupprobeLiveness Probes 和 Readiness Probes演示若存在started.html 则进行 探针的使用 kubectl edit deploy -n kube-system corednslivenessprobe 的使用 livenessProbe:failureThreshold: 5httpGet:path: /heal…

谷歌搜索技巧与 ChatGPT 实用指南:提升你的在线生产力

探索谷歌搜索技巧&#xff0c;提升搜索效率 前言 在搜索三巨头百度、必应、谷歌中&#xff0c;谷歌在搜索精确度以及多语言兼容性方面有明显的优势。其次在国内想要使用谷歌搜索你需要会科学上网&#xff08;这里不说&#xff09;。 一.排除干扰内容&#xff08;广告&#xff…

RAG (Retrieval Augmented Generation)简介

1. 背景 目前大模型很多&#xff0c;绝大部分大模型都是通用型大模型&#xff0c;也就是说使用的是标准的数据&#xff0c;比如wikipedia&#xff0c;百度百科&#xff0c;。。。。 中小型企业一般都有自己的知识库&#xff0c;而这些知识库的数据没有在通用型的大模型中被用到…

mysql数据库 mvcc

在看MVCC之前我们先补充些基础内容&#xff0c;首先来看下事务的ACID和数据的总体运行流程 数据库整体的使用流程: ACID流程图 mysql核心日志: 在MySQL数据库中有三个非常重要的日志binlog,undolog,redolog. mvcc概念介绍&#xff1a; MVCC&#xff08;Multi-Version Concurr…

【MySQL】外键约束的删除和更新总结

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-7niJLSFaPo0wso60 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

MySQL 基础知识(一)之数据库和 SQL 概述

目录 1 数据库相关概念 2 数据库的结构 ​3 SQL 概要 4 SQL 的基本书写规则 1 数据库相关概念 数据库是将大量的数据保存起来&#xff0c;通过计算机加工而成的可以进行高效访问的数据集合数据库管理系统&#xff08;DBMS&#xff09;是用来管理数据库的计算机系统&#xf…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核基础-互斥锁mux

目录 一、互斥锁基本概念二、互斥锁运行机制三、互斥锁开发流程四、互斥锁使用说明五、互斥锁接口六、代码分析&#xff08;待续...&#xff09; 一、互斥锁基本概念 互斥锁又称互斥型信号量&#xff0c;是一种特殊的二值性信号量&#xff0c;用于实现对共享资源的独占式处理。…

Web 目录爆破神器:Dirsearch 保姆级教程

一、介绍 dirsearch 是一款用于目录扫描的开源工具&#xff0c;旨在帮助渗透测试人员和安全研究人员发现目标网站上的隐藏目录和文件。与 dirb 类似&#xff0c;它使用字典文件中的单词构建 URL 路径&#xff0c;然后发送 HTTP 请求来检查这些路径是否存在。 以下是 dirsearc…

Python算法深度探索:从基础到进阶

引言 本文将引导您从Python的基础算法出发&#xff0c;逐步深入到更复杂的算法领域。我们将探讨数组操作、图算法以及机器学习中的常用算法&#xff0c;并通过实例和代码展示它们在实际应用中的价值。 1. 基础算法&#xff1a;数组操作 数组操作是算法实现中非常基础且重要的一…

预算紧缩下创新创业者应采取哪3个策略来保持创新?

在今天越来越饱和的消费市场中&#xff0c;品牌零售通过复杂、过度的的促销、折扣、优惠券和忠诚度奖励来吸引消费者&#xff0c;但这种做法可能削弱消费者的忠诚度&#xff0c;损害品牌声誉&#xff0c;并抑制新的收入机会。相反&#xff0c;零售商应采取更简化、以客户为中心…