05C零碎语法

C零碎语法

目录

文章目录

  • C零碎语法
    • 1.函数指针
    • 2.回调函数
    • 3.数据拷贝
      • 3.1静态内存分配![请添加图片描述](https://img-blog.csdnimg.cn/direct/54d44e32bb7944f0866d4ca1e2667ce8.png)### 4.1动态内存分配
  • 字符串
    • 6.sizeof()和strlen()的区别
    • 7.strcpy()/strncpy()函数
      • 7.1**strcpy() 函数用于将一个字符串复制到另一个字符串中**
      • 7.2strncpy() 函数提供了一种更安全的方式来复制字符串

1.函数指针

#include <stdio.h>
 
int max(int x, int y)
{
    return x > y ? x : y;
}
 
int main(void)
{
    /* p 是函数指针 */
    int (* p)(int, int) = & max; // &可以省略
    int a, b, c, d;
 
    printf("请输入三个数字:");
    scanf("%d %d %d", & a, & b, & c);
 
    /* 与直接调用函数等价,d = max(max(a, b), c) */
    d = p(p(a, b), c); 
 
    printf("最大的数字是: %d\n", d);
 
    return 0;
}

2.回调函数

函数指针作为某个函数的参数

以下是来自知乎作者常溪玲的解说:
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
#include <stdlib.h>  
#include <stdio.h>
 
// 回调函数
void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{
    for (size_t i=0; i<arraySize; i++)
        array[i] = getNextValue();
}
 
// 获取随机值
int getNextRandomValue(void)
{
    return rand();
}
 
int main(void)
{
    int myarray[10];
    /* getNextRandomValue 不能加括号,否则无法编译,因为加上括号之后相当于传入此参数时传入了 int , 而不是函数指针*/
    populate_array(myarray, 10, getNextRandomValue);
    for(int i = 0; i < 10; i++) {
        printf("%d ", myarray[i]);
    }
    printf("\n");
    return 0;
}
typedef struct {
    int status;
    void (*statusChange)(int status);
} JT_Device;

JT_Device gDevice;

void addCallbackFunc(JT_Device *device, void (*pstatusChange)(int status)) {
    device->statusChange = pstatusChange;
}

void run(JT_Device *device) {
    device->status = 10;
    if(device->status == 1) { // 假设这里是1而不是1e
        if(device->statusChange != NULL) {
            device->statusChange(device->status);
        }
    }
}
 // 用户代码
void callBack(int status) {
    printf("Callback:\n");
    printf("status = %d\n", status);
}

int main() {
    addCallbackFunc(&gDevice, callBack);
    run(&gDevice);
    return 0;
}

3.数据拷贝

3.1静态内存分配请添加图片描述### 4.1动态内存分配

请添加图片描述## 5.二维数组做形参

#include <stdio.h>

int getArrayData(int (*p)[4], int lines, int columns) //数组指针来接收二维数组的地址,行数,列数
{ 
    int data;
    return data = *(*(p + lines) + columns);
}

int main()
{
    int array[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
	int data;
    data = getArrayData(array, 1, 1); //获取array[1][1]的值
    return 0;
}

字符串

6.sizeof()和strlen()的区别

char str[] = "hello";  //结尾有'\0'
sizeof(str);  //6,计算的是整个空间的长度
strlen(str);  //5,只计算有效字符,会忽略结尾的'\0'

char *p = "hello";
sizeof(p);  //8,p是一个char *
strlen(p);  //5
sizeof(p) 返回的是指针变量 p 的大小(地址的大小),在64位系统上通常是8字节。 strlen(p) 返回的是指针 p 指向的字符串的长度(不包括结尾的 \0),对于 "hello" 这个字符串是5。

7.strcpy()/strncpy()函数

7.1strcpy() 函数用于将一个字符串复制到另一个字符串中

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, World!";
    char dest[20];

    strcpy(dest, src); // 将src复制到dest

    printf("Destination: %s\n", dest);
    return 0;
}

注意
strcpy() 不检查目标数组的大小,如果目标数组不够大,可能会导致缓冲区溢出,这是一个常见的安全问题。
它在复制完所有字符后不会在目标字符串的末尾添加空字符 \0,所以它假定源字符串以 \0 结尾。

7.2strncpy() 函数提供了一种更安全的方式来复制字符串

允许你指定最大复制的字符数

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, World!";
    char dest[20];

    strncpy(dest, src, 13); // 将src的前13个字符复制到dest

    // 确保字符串以空字符结尾
    dest[13] = '\0';

    printf("Destination: %s\n", dest);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重生之 SpringBoot3 入门保姆级学习(16、函数式 Web 编程)

重生之 SpringBoot3 入门保姆级学习&#xff08;16、函数式 Web 编程&#xff09; 3.4 函数式 Web 3.4 函数式 Web 个人写过 go 类似于 go gin 框架 1、场景 场景: User RESTful - CRUD GET/user/1 获取1号用户GET/users 获取所有用户POST/user 清求体携带JSON&#xff0c;新…

【Tlias智能学习辅助系统】04 部门管理 删除 和 新增

Tlias智能学习辅助系统 04 部门管理 删除 和 新增 删除部门APIDeptController.javaDeptService.javaDeptServiceImpl.javaDeptMapper.java前端联调 新增部门API有一步简化DeptController.javaDeptService.javaDeptServiceImpl.javaDeptMapper.java前端联调 删除部门API 请求路径…

友善RK3399v2平台利用rkmpp实现硬件编解码加速

测试VPU 编译mpp sudo apt update sudo apt install gcc g cmake make cd ~ git clone https://github.com/rockchip-linux/mpp.git cd mpp/build/linux/aarch64/ sed -i s/aarch64-linux-gnu-gcc/gcc/g ./arm.linux.cross.cmake sed -i s/aarch64-linux-gnu-g/g/g ./arm.lin…

6月2号总结

刷题记录Codeforces Round 925 &#xff08;A,B,C&#xff09; 1.A. Recovering a Small String 问题 - A - Codeforces 输入&#xff1a; 5 24 70 3 55 48 输出&#xff1a; aav rzz aaa czz auz 给定一个3~78的整数&#xff0c;将这个整数分成a,b,c&#xff0c;其中1表示…

洛谷P2370yyy2015c01 的 U 盘

传送门——P2370 yyy2015c01 的 U 盘 题解&#xff1a;题目意思很好理解&#xff0c;就是说&#xff0c;当能够达到预期的U盘的最小接口&#xff08;接口越大&#xff0c;能传递的文件越大&#xff09;&#xff0c;然后我们就需要先看题目了&#xff0c;有n个文件&#xff0c;每…

C# 使用Aspose生成和修改文档

Aspose库 C#中的Aspose库是一个强大的文件处理库&#xff0c;可以用于各种文件格式的创建、编辑、转换和操作。该库提供了丰富的功能&#xff0c;包括处理文档、电子表格、幻灯片、PDF、图像等多种文件格式&#xff0c;能够轻松实现文件的读取、写入、格式化、样式设置、数据操…

双指针法 ( 三数之和 )

题目 &#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

设计模式——结构型模式——责任链模式

责任链模式简介 责任链模式&#xff0c;又名职责链模式&#xff0c;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;将所有请求处理者通过前一对象记住其下一个对象的引用而成一条链&#xff1b;当有请求发生时&#xff0c;可将请求沿着这条链传递&#xff0c;传递过…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十四)- 微服务(4)

目录 8. http客户端Feign 8.1 feign远程调用 8.2 feign自定义配置 8.3 feign性能优化 8.4 feign最佳实践 8. http客户端Feign 8.1 feign远程调用 RestTemplate存在的问题 &#xff1a; 代码可读性差 参数复杂URL难以维护 Feign是声明式的http客户端 使用步骤 &#xf…

03 使用堡塔和xshell

课程的目标 1、理解windows于Linux实现远程通信的过程和所使用的协议SSH 2、熟练使用远程连接工具堡塔和xshell等工具以及SSH和SCP&#xff0c;命令 课程实验 使用堡塔远程并操作centos并实现与windows之间的文件传输 2、使用xshell远程连接并操作centos与windows之间的文…

Day 10:100322. 删除星号以后字典序最小的字符串

Leetcode 100322. 删除星号以后字典序最小的字符串 给你一个字符串 s 。它可能包含任意数量的 ‘’ 字符。你的任务是删除所有的 ’ 字符。 当字符串还存在至少一个 ‘*’ 字符时&#xff0c;你可以执行以下操作&#xff1a; 删除最左边的 ‘*’ 字符&#xff0c;同时删除该星号…

EasyX的安装及使用

Easy X的下载 首先&#xff0c;打开EasyX的官网&#xff0c;点击下载。 下载完成&#xff0c;直接双击文件。点击下一步&#xff0c;直接点击安装&#xff0c;即可安装完成。 Easy X的使用 要使用Easy X&#xff0c;就要在编写代码时&#xff0c;使用头文件&#xff0c;其有两…

自定义注解处理器生成代码

前言 源码中给的几种注解处理器代码都是网上抄的&#xff0c;本文主要是提供了 Maven 源码&#xff0c;不需要自己网上研究爬坑(当然具体生成代码的逻辑还是得自己写)。且从 lombok 抄了可以解决 idea 代理 ProcessingEnvironment 类后所产生的问题。 以下是网上抄的注解处理…

用java实现客服聊天+网络爬虫下载音乐(java网络编程,io,多线程)

一 灵感&#xff1a; 在2022年的暑假&#xff0c;也就是我即将迈进高三的那个暑假&#xff0c;我并没有察觉自己应该要学习了&#xff0c;还是和过往的暑假一样玩着王者荣耀&#xff0c;凌晨2点睡觉&#xff0c;中午12点起床。我依稀记得这种状态一直持续到8月19。然而离开学还…

最全!最新!最细!Redis数据库从入门到应用

#前言&#xff1a; 该博客会详细介绍关于Redis数据库的内容&#xff0c;代码多有注释&#xff0c;最后会讲解如何将Redis应用&#xff08;以Python与Django为例&#xff09;。各位的点赞与关注将是小编变强的最大动力。 一、Redis数据库简介&#xff1a; Redis是一个开源的内…

fyne widget小部件2

fyne widget小部件2 form表单 package mainimport ("log""fyne.io/fyne/v2/app""fyne.io/fyne/v2/widget" )func main() {myApp : app.New()myWindow : myApp.NewWindow("Form Widget")entry : widget.NewEntry()textArea : widget.…

Stable Diffusion详细教程

目录 &#x1f40b;引言 &#x1f40b;Stable Diffusion基本概念 &#x1f988;潜在扩散模型 &#x1f988;图像生成原理 &#x1f40b;Stable Diffusion安装部署 &#x1f988;环境要求 &#x1f988;安装步骤 &#x1f40b;Stable Diffusion阶段 &#x1f988;准备阶…

正弦、余弦、正切

正弦、余弦、正切这三个概念都是在一个直角三角形这样一个上下文环境里定义的。在一个直角三角形中&#xff0c;斜边叫弦。 正弦&#xff08;sine&#xff09; 在一个给定的角θ&#xff0c;它的正弦就是这个角θ对着的直角边与弦的比值&#xff0c;记为sineθ。 余弦&#…

你想让ai干苦力,ai会叫你没脾气(问题实例)

当你想让ai生成的代码直接编译 - 你先要问自己一个直击灵魂的主题&#xff1a;我的修养配得上我的能力吗&#xff1f; 已发现存在需手动修复的问题 - 1/&#xff08;马大哈&#xff09;对于sdk理解的不 细致 &#xff0c;会用基类函数来代替派生类函数&#xff1b; 比如&#…

【kubernetes】探索k8s集群的pod控制器详解(Deployment、StatefulSet、DaemonSet、Job、CronJob)

目录 一、Pod控制器及其功用 二、pod控制器有多种类型 2.1ReplicaSet 2.1.1ReplicaSet主要三个组件组成 2.2Deployment 2.3DaemonSet 2.4StatefulSet 2.5Job 2.6Cronjob 三、Pod与控制器之间的关系 3.1Deployment 3.2SatefulSet 3.2.1StatefulSet三个组件 3.2.2为…