C/C++|物联网开发入门+项目实战|空间读写|非字符空间|返回值内部实现|嵌入式C语言高级|C语言函数的使用(2)-学习笔记(12)

news2025/1/16 5:16:36

文章目录

      • 空间的读写
      • 作用
        • 实现strlen
        • 实现strcpy
      • 非字符空间
      • void*
    • 返回值
      • 返回连续空间类型
        • 示例:
      • 函数内部实现
        • 示例:

参考: 麦子学院-嵌入式C语言高级-C语言函数的使用

空间的读写

void fun(char *p);
const char *p 只读空间,只为了看
char *p;该空间可能修改,几乎都要变

strcpy();
定义:char *strcpy(char *dest,const char *src);

sprintf();

作用

1、修改 int * short * long *
2、空间传递
2.1 子函数看看空间里的情况 const *
2.2 子函数反向修改上层空间里的内容 char * void * 都代表反向修改
void fun(const int *p) //第一反应仅是上层对下层的查看功能

字符空间:空间首地址,结束标志的不同
结束标志:内存里面存放了0x00(1B),字符空间
非字符空间0x00,不能认为是结束。
void fun(char *p)
{
int i = 0;
p[i]++;
while(p[i]){
p[i]操作 p[i] = x; a = p[i] + -
i++;
}
}

实现strlen

int strlen(const char *p){
/错误处理,判断输入参数是否合法?/
if(p==NULL){
//return…
}
/内存处理,从头到尾逐一处理,遍历/
while(p[i]){
//;
i++;
}
}

实现strcpy

void strcpy(char *dest,const char *src);

“”===>初始化const char*
char buf[10]—>初始化 char *

非字符空间

unsigned char *p;
结束标志:数量(个数)B字节
int *p unsigned char *p
short *p struct abc *p
void * :数据空间的标志
大小

void fun(unsigned char *p,int len)
{
    int i;
    for(i=0;i<len;i++)
        p[i];
        a = p[i] //++++++++++
}
int main()
{
    struct bensor_data buf;

    fun(&buf,sizeof(buf)*1);

}

memcpy函数
void *memcpy (void *dest, const void *src,size_t n);
recv函数:
ssize_t recv(int sockfd,void *buf, size_t len, int flags);
send函数
ssize_t send(int sockfd, const * void xuf, size_t len, int flaqs);

void*

int fun(void *buf,int len)
{
unsigned char *tmp = (unsigned char *)buf;
tmp[i] i++ len
}

返回值

提供启下功能的一种表现形式
基本语法
返回值或者输入地址的传递达到返回信息的目的
返回类型 函数名称(输入列表)
{
return
}
调用者
a = fun(); //生命周期很短
被调者:
int fun()
{
return num;
}

拷贝
示例:

#include <stdio.h>

int fun(void)
{
    return 0x123;
}


int main()
{
    int ret;

    ret = fun(); //拷贝给ret

    printf("the ret is %x\n",ret);
    return 0;
};
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// the ret is 123
//如果函数定义改为char ,则只返回8位
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// the ret is 123

返回基木数据类型
基本数据:int char
指针类型: 空间,不能是数组
int fun(void)
{
return
}

struct abc fun(void); //工程中不建议使用,冗余度太高,应该用连续空间

int fun1(void); int a; a = fun1(); //定义一个一模一样的类型接收就可以

void fun2(int *p); int a = 0; fun2(&a);a //通过输入参数承上启下,传递一个int类型的地址给输入参数,才能够上层对下层进行修改

int fun(int *); //承上启下的功能可以实现2个

int *fun1(void);
int main()
{
int *p;
p = fun1();
}

void fun2(int **p) //变向指向一个地址
int main()
{
int *p;
fun2(&p);
p;
}

返回连续空间类型

return a[10];
指针作为空间返回的唯一数据类型
int *fun();
地址:指向的合法性,作为函数的设计者,必须保证函数返回的地址所指向的空间是合法的,不能是局部变量。

示例:

#include <stdio.h>

char  *fun(void)
{
   char buf[] = "hello world!"; //buf为fun所管理的局部变量

   return buf; //return后buf就回收了
}


int main()
{
    char *p;

    p = fun();
    printf("the p is %s\n",p);
    return 0;
};
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// 2.c: In function 'fun':
// 2.c:7:4: warning: function returns address of local variable [enabled by default]
// the p is `#?
//如果改成常量:
char  *fun(void)
{
   //char buf[] = "hello world!"; //buf为fun所管理的局部变量

   return "hello world"; //常量区是固定的,不会回收
}
//可以正常打印
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// the p is hello world

使用者:
int *fun();
int *p = fun(); //只接收程序地址就可以,定义一个一样的接收即可。

函数内部实现

基本数据类型 fun(void)
{
基本数据类型 ret;
xxxx;
ret = xxxx;
return ret;
}

int fun()
{
int ret = =;
count ++;
ret = xxx;
return ret;
}

地址类型相对复杂:
char *fun()
{
char *s = NULL;
char buf[];
return buf;

}
1.静态区,函数生命周期内
char *fun(void)
{
static char buf[] = “hello world!”; //static以后认为是在静态区,数据段中

return buf;
}
2.只读区,工程上意义不大,可忽略,
char *fun(void)
{
//char buf[] = “hello world!”; //buf为fun所管理的局部变量

return “hello world”; //常量区是固定的,不会回收
}
3.堆区:malloc函数和free函数

示例:

#include <stdio.h>

char  *fun(void)
{
   //static char buf[] = "hello world!"; //static以后认为是在静态区,数据段中
   char *s = (char *)malloc(100); //申请
   strcpy(s,"hello world"); //初始化
   return s;
}


int main()
{
    char *p;

    p = fun();
    printf("the p is %s\n",p);

    free(p); //释放
    return 0;
};
// E:\temp>cd "e:\temp\" && gcc 2.c -o 2 && "e:\temp\"2
// 2.c: In function 'fun':
// 2.c:6:22: warning: incompatible implicit declaration of built-in function 'malloc' [enabled by default]
// 2.c:7:4: warning: incompatible implicit declaration of built-in function 'strcpy' [enabled by default]
// 2.c: In function 'main':
// 2.c:19:5: warning: incompatible implicit declaration of built-in function 'free' [enabled by default]
// the p is hello world
//man malloc 打开手册,会告知你该引用哪个头文件
// 增加:(警告消失)
// #include <string.h>
// #include <stdlib.h>

man fopen
FILE *fopen (constchar *path,const char *mode) ;
返回值指向堆区或者静态区,返回的FILE不是标准类型,具体看说明,但如果是堆区,必须使用后free。
在这里插入图片描述

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

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

相关文章

多功能PDF工具合集:PDF Squeezer - PDF Toolbox Mac

PDF Squeezer - PDF Toolbox Mac是多功能PDF工具合集。专为操作 PDF 文件而设计&#xff0c;包含几乎所有你能想象到的操作&#xff0c;例如&#xff1a;压缩、合并、拆分、提取、插入、提取图像、转换图像、提取文本、排序、加密等。如果你正在为操作PDF文件发愁&#xff0c;快…

关于yolov8的一些理解

文章目录 1.前言2.创新点及工作3. 网络结构3.1 BackBone3.1.1 C2F3.1.2 结构微调3.1.2 SPPF 3.2 Neck3.3 Head 4.正样本匹配策略4.1 静态分配策略&动态分配策略4.2 TaskAlignedAssigner 5.损失函数5.1 概述5.2 Distribution Focal Loss 6.总结 1.前言 YOLOv8 是 ultralyti…

在Eclipse中安装配置JDK11

下载安装包 从请官方下载&#xff0c;地址为&#xff1a;https://www.oracle.com/java/technologies/javase-jdk11-downloads.html&#xff0c;选择相应的版本下载即可。注意&#xff0c;现在需要注册才能下载。 ** ** 安装JDK11 使用下载的安装包进行安装&#xff0c;双击可…

Hyperledger Fabric 2.x 环境搭建

一、说明 区块链网络的核心是分布式账本&#xff0c;在这个账本中记录了网络中发生的所有交易信息。 Hyperledger Fabric 是一个是开源的&#xff0c;企业级的&#xff0c;带权限的分布式账本解决方案的平台。Hyperledger Fabric 由模块化架构支撑&#xff0c;并具备极佳的保…

拉格朗日粒子扩散模式FLEXPART

为了高效、精准地治理区域大气污染&#xff0c;需要弄清污染物的来源。拉格朗日粒子扩散模式FLEXPART通过计算点、线、面或体积源释放的大量粒子的轨迹&#xff0c;来描述示踪物在大气中长距离、中尺度的传输、扩散、干湿沉降和辐射衰减等过程。该模式既可以通过时间的前向运算…

Pytorch基础 - 7. torch.transpose() 和 torch.permute()

目录 1. torch.transpose(dim0, dim1) 2. torch.permute(dims) 3. 在转置函数之后使用view() PyTorch中使用torch.transpose() 和 torch.permute()可对张量进行维度的转置&#xff0c;具体内容如下&#xff1a; 1. torch.transpose(dim0, dim1) 参数: 需要转置的两个维度…

React native RN 开发实例

多入口加载方式 React Native 混合开发多入口加载方式 - 知乎 initialProperties 官方文档&#xff1a;React Navigation moduleName 案例&#xff1a;GitHub - hcn1519/ReactNative-iOS-Example React Native 混合开发多入口加载方式 - 知乎 项目结构 参考&#xff1…

传奇修改怪物属性教程:传奇服务端架设后怪物不主动攻击是什么原因?

当你架设好传奇服务端后怪物不主动攻击是什么原因呢&#xff1f;今天飞飞来和你分享 1、检查是否进入了管理员隐藏模式 如果是你设置了GM号进入了隐身模式&#xff0c;登录游戏就会有登录脚本默认管理上线检测&#xff0c;怪物看到你是GM管理员自然不会攻击你的&#xff0c;你…

(顶级理解)为什么Vue中的v-if 和v-for不建议一起用?

目录 1.背景 2.原因 3.通俗案例 4.解决方案 5.扩展&#xff08;强烈看下&#xff09; 1.背景 我们都知道v-if和v-for是vue开发工程中十分常用的方法 2.原因 当 v-if 与 v-for 一起使用时&#xff0c;v-for 具有比 v-if 更高的优先级。这意味着 v-if 将分别重复运行于 每…

jQuery 基础入门速成下篇

jQuery高级 事件冒泡 什么是事件冒泡&#xff1f; 在一个对象上触发某类事件&#xff0c;此对象上定义了此事件的处理程序&#xff0c;那么此事件就会调用这个处理程序&#xff0c;如果没有定义此事件处理程序或事件返回true&#xff0c;那么这个事件会向这个对象的父级对象传…

门禁系统中人脸检测技术的原理剖析和使用教程

引言 人脸检测 API 是一种基于深度学习技术的图像处理API&#xff0c;可以快速地检测出一张图片中的人脸&#xff0c;并返回人脸的位置和关键点坐标&#xff0c;在人脸识别系统、人脸情绪识别等多种场景下都有极大的应用。 本文将从人脸检测的发展历程、原理、特点等角度出发…

第五章 RNN

目录 5.1 概率和语言模型5.1.1 概率视角下的 word2vec5.1.2 语言模型5.1.3 将CBOW模型用作语言模型&#xff1f; 5.2 RNN5.2.1 循环的神经网络5.2.2 展开循环5.2.3 Backpropagation Through Time5.2.4 Truncated BPTT5.2.5 Truncated BPTT的mini-batch学习 5.3 RNN的实现5.3.1 …

【博云+智领云】携手云原生大数据领域,开展深度合作

近日&#xff0c;博云与LinkTimeCloud智领云达成战略合作伙伴关系&#xff0c;基于此前坚实合作基础&#xff0c;全面拓宽合作广度与深度&#xff0c;共同推出基于Kubernetes的企业级容器云云原生大数据技术融合的新型数字化IT底座&#xff0c;并且在某国家级创新中心首次落地。…

高精度的乘除法(C++实现)

前言&#xff1a;我们都熟知高精度的加减法可以用字符串来模拟实现&#xff0c;其实乘除法的高精度计算也和加减法类似却也略有不同&#xff0c;下面我们一起来看一下高精度的乘除法的模拟实现&#xff0c;希望可以帮助到大家。 目录 1.高精度乘法的实现 1.1原理重点难点解析…

一图看懂 pyexcel 模块:提供统一 API用来读写操作 Excel 文件的库, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 pyexcel 模块&#xff1a;提供统一 API用来读写操作 Excel 文件的库, 资料整理笔记&#xff08;大全&#xff09; 摘要模块图类关系图模块全展开【pyexcel】统计常量模块1 …

ABAP:自定义搜索帮助:可参考标准函数F4IF_SHLP_EXIT_EXAMPLE

当我们在自定义选择屏幕中&#xff0c; 需要写入我们自定义的搜索帮助的时候&#xff0c;可以通过预定义函数来实现&#xff1a; 实例说明&#xff1a; 第一步&#xff1a;创建搜索帮助SE11分销渠道(Z_VTWEG) 1.选择基本索引帮助&#xff1a; 2.选择参考表&#xff0c;因为这…

Java 基础——HashMap 底层数据结构与源码分析

目录 1.HashMap 简介2.HashMap 底层数据结构2.2.JDK1.8 之前2.3.JDK1.8 及以后 3.常量定义3.1.默认初始化容量3.2.最大容量3.3.负载因子3.4.阈值 4.HashMap 源码分析4.1.构造函数4.2.Node<K, V>4.2.put(K key, V value)流程源码 4.3.get(Object key)流程源码 4.4.resize(…

java使用阿里云oss上传文件

java使用阿里云oss上传文件 1、oss 是什么&#xff1f; OSS是阿里云对象存储服务&#xff08;Object Storage Service&#xff09;的一个简称&#xff0c;它是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 即开即用、无限大空间的存储集群。相较传统建服务器存储而…

逻辑回归模型预测

范例题目&#xff1a; 建立一个逻辑回归模型预测一个学生是否通过研究生入学考试。N表示训练集中学生个数&#xff0c;Score1、Score2、 Score3、 Score4是N维数组&#xff0c;分别表示N个学生研究生初试、专业课复试、英语面试成绩、专业课面试成绩。Admitted是N维{0,1}数组&a…

RabbitMQ编程模型

RabbitMQ基础概念 RabbitMQ是基于AMQP协议开发的一个MQ产品。 虚拟主机 virtual host RabbitMQ出于服务器复用的想法&#xff0c;可以在一个RabbitMQ集群中划分出多个虚拟主机&#xff0c;每一个虚拟主机都有AMQP的全套基础组件&#xff0c;并且可以针对每个虚拟主机进行权…