C/C++

2023-11-01


参考: 麦子学院-嵌入式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。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++ 的相关文章

  • 【PHP】Phpstorm环境配置与应用

    一 Phpstorm环境配置 1 点击左上端File 选择下拉框中的setting 进入环境配置页面 如下图 2 如下图点击1处 选中下拉框中的Deployment Type 图示2处 下拉框中选择Local or mounted fold
  • ADB详解

    文章目录 ADB概述 一 安装与连接 二 常规使用方法 三 Adb shell 四 性能统计dumpsys 五 Monkey工具 ADB概述 ADB Android Debug Bridge 顾名思义 安卓调试桥 是一种功能多样的命令行工具
  • 不同jdk环境导致md5不一致

    加密访问接口 运行jar包发现就导致错误 idea测试没有问题 这还都是在本机运行 单步调试发现出现结果不一致地方出现在以下代码处 MessageDigest sec MessageDigest getInstance MD5 sec re
  • 部门来了个拿25k出来的00后测试卷王,老油条表示真干不过,已被...

    内卷的来源 内卷最早的 出处 是几张名校学霸的图片 大学生们刷爆朋友圈的几张 内卷 图片是这样的 有的人骑在自行车上看书 有的人宿舍床上铺满了一摞摞的书 有的人甚至边骑车边端着电脑写论文 这些图片最早在清华北大的学霸之间流传 之后 边骑车边

随机推荐

  • Linux共享文件夹到windows服务器

    1 安装Samba yum y install samba samba client samba common 2 添加要使用的账号 useradd s sbin nologin username smbpasswd a username
  • 闭眼推荐,9 个不能错过的机器学习数据集

    内容一览 本期整理了 HyperAI超神经官网近期更新的 9 个数据集 涉及人脸识别 姿态估计 自动驾驶三个领域 关键词 人脸识别 姿态估计 自动驾驶 本文首发自微信公众号 HyperAI 超神经 近期 HyperAI超神经官网更新了 30
  • springboot + vue项目本地化部署配置内+外网

    1 项目使用nginx做访问代理 配置如下 内网访问配置 server listen 80 server name 192 168 0 235 client max body size 100M charset koi8 r access
  • 开发Hololens遇到The type or namespace name ‘HandMeshVertex‘ could not be found..

    The type or namespace name HandMeshVertex could not be found are you missing a using directive or an assembly reference
  • C语言——循环控制语句

    文章目录 循环控制语句 for循环控制 1 基本语法 2 注意事项和细节说明 3 练习 1 打印1 100之间所有是9的倍数的整数的个数及总和 使用for完成 2 先死后活的一种编程思想 while循环控制 1 基本语法 2 注意事项和细节
  • 谷歌浏览器如何安装vue调试工具

    下载vue devtools压缩包 git地址 vue devtools 安装环境 将下载的压缩包解压 并通过命令行进入vue devtools master文件夹中 输入安装命令 cnpm install进行安装 编译 输入编译命令 np
  • a-textarea实现自动出现滚动条不能自动伸缩

    deep textarea width 100 height 50px overflow y auto resize none
  • 2023年贵州省职业技能大赛“网络安全” 项目比赛任务书

    2023年贵州省职业技能大赛 网络安全 项目比赛任务书 2023年贵州省职业技能大赛 网络安全 项目比赛任务书 A模块基础设施设置 安全加固 200分 A 1 登录安全加固 Windows Linux A 2 Nginx安全策略 Linux
  • MYSQL数据文件默认在哪个目录下?

    原文地址 MYSQL数据文件默认在哪个目录下 在Windows平台默认一般在C ProgramData MySQL C ProgramData MySQL MySQL Server X X Data文件夹中 无论在Windows还是在Lin
  • STM32 (三)GPIO的八种模式及其原理

    一 GPIO简介 GPIO就是通用I O 输入 输出 端口 是STM32可控制的引脚 STM32芯片的GPIO引脚与外部设备连接起来 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 二 GPIO工作模式 1 四种输入模式 GPIO
  • 每天一个linux命令(46):vmstat命令

    vmstat是Virtual Meomory Statistics 虚拟内存统计 的缩写 可对操作系统的虚拟内存 进程 CPU活动进行监控 他是对系统的整体情况进行统计 不足之处是无法对某个进程进行深入分析 vmstat 工具提供了一种低开
  • 用C++做高级病毒

    今天教大家做几个超级厉害的病毒 看完这篇文章之后你就能成为一名高级黑客了 声明 若电脑收到损伤 作者一律不负责 1 鼠标病毒 作用 让鼠标一直停在一个地方动不了 include
  • js Dom事件

    1 onclick 点击事件 2 ondbclick 双击事件 3 onmousedown 鼠标按下事件 4 onmouseup 鼠标松开事件 5 onmouseenter 鼠标移入事件 不支持冒泡 只触发一次 6 onmouseover
  • xml实体小实例

    如何定义和使用实体 一下是实体的一个小实例 gt
  • C++里仿函数是什么

    一 什么是仿函数 仿函数的意思是 它不是函数 其实是个类 但用法和函数一样 既然是个类 就可以存储很多变量和其他的信息 然后实现纯函数实现不了的功能 所以在一些需要函数作为参数的地方可以用仿函数代替 在STL里很多地方用到了仿函数 二 仿函
  • Java 密码复杂度校验

    1 需求 复杂性 用户的密码中必须包含的字符类型 默认为中 弱 必须包含小写字母 中 必须包含小写字母 数字 强 必须包含小写字母 数字 大写字母 特殊字符 鼠标移入的提示文字相同 注 检查密码复杂度 仅新增账户 重置密码时生效 已有账户密
  • 揭示OLED透明屏数据:探索未来显示技术的潜力

    OLED透明屏作为一项颇具吸引力的显示技术 以其独特的特点和卓越的画质在市场上引起了广泛关注 在这篇文章中 尼伽将和大家一起深入探索OLED透明屏的数据 通过具体的市场趋势分析 技术指标解析 应用领域探讨和未来前景展望 为读者提供全面了解和
  • wish虚拟服务器,云服务器操作wish

    云服务器操作wish 内容精选 换一换 按需计费 按需计费是后付费模式 按弹性云服务器的实际使用时长计费 可以随时开通 删除弹性云服务器 包年 包月 包年 包月是预付费模式 按订单的购买周期计费 适用于可预估资源使用周期的场景 价格比按需计
  • [开发

    ModelMapper是一个用于对象之间转换的Java库 它能够自动映射一个Java对象的属性到另一个Java对象 依赖安装
  • C/C++

    文章目录 空间的读写 作用 实现strlen 实现strcpy 非字符空间 void 返回值 返回连续空间类型 示例 函数内部实现 示例 参考 麦子学院 嵌入式C语言高级 C语言函数的使用 空间的读写 void fun char p con