指针2 1月31日学习笔记

news2024/12/27 13:56:57

一、strncpy、strncmp、strncat函数

strncpy函数用于将一个字符串的一部分拷贝到另一个字符串中。


  char* strncpy(char *dest, const char *src, size_t n)
           {
               size_t i;

               for (i = 0; i < n && src[i] != '\0'; i++)
                   dest[i] = src[i];
               for ( ; i < n; i++)
                   dest[i] = '\0';

               return dest;
           }

char *strncpy(char *dest, const char *src, size_t n)
{  
   正常拷贝 
   多了 一个n 
   n < strlen(src)  
     只拷贝前n个字符,最终dest中不会有'\0'
   n == strlen(src)
     正常拷贝 
   n > strlen(src)
   if (n) 拷贝够了次数 
   剩余拷贝 统统补0
   
   思路:
   
   // 结束条件 *src == '\0'
   // n次 拷贝完成没有

 

strncmp函数用于比较两个字符串的前n个字符。

int strncmp(const char *str1, const char *str2, size_t n)
{
    while (n > 0 && (*str1 || *str2)) {
        if (*str1 != *str2) {
            return (*str1 - *str2);
        }
        str1++;
        str2++;
        n--;
    }
    return 0;
}

strncat函数用于将一个字符串的一部分追加到另一个字符串的末尾。

char *strncat(char *dest, const char *src, size_t n)
{
    char *dest_end = dest;
    
    // 查找目标字符串的结尾位置
    while (*dest_end != '\0') {
        dest_end++;
    }
    
    // 拷贝源字符串的前n个字符到目标字符串的结尾
    while (*src != '\0' && n > 0) {
        *dest_end = *src;
        dest_end++;
        src++;
        n--;
    }
    
    // 在目标字符串末尾添加结束符'\0'
    *dest_end = '\0';
    
    return dest;
}

二、回调函数 与 函数指针

回调函数: 通过函数指针调用的函数 叫回调函数  (将一个函数作为参数传递给另一个函数)
 
 技术上: 通过函数指针的实现 
 
 函数指针(指向基类型-为函数类型) 函数类型的指针  

返回类型 (*指针变量名称)(参数列表)

int sum(int a, int b);   //定义的一个两数求和的函数
int (*sum_p)(int, int);   //  定义的一个类型为 int () (int,int)型的函数指针sum_p
sum_ptr = sum;  // 可以将函数名作为地址赋给 函数指针
int result = sum_p(3, 4);   //  然后就可以用函数指针调用 sum()函数

 函数指针的类型必须与指向的函数的类型匹配,包括返回类型和参数列表的类型

linux内快速排序算法的一个官方函数


  void qsort(void *base, size_t nmemb, size_t size,

                               int (*compar)(const void *, const void *));

  • base:指向待排序数组的起始地址的指针。
  • nmemb:数组中元素的数量。
  • size:每个元素的大小(以字节为单位)。
  • compar:指向比较函数的指针。

compar 函数是一个用户定义的比较函数,用于决定数组中两个元素的顺序。它接受两个指向待比较元素的 const void* 类型的指针,并返回一个 整数值。根据返回值的不同,qsort 函数会对数组进行排序。

  • 如果返回值小于零,则表示第一个元素应该在第二个元素之前。
  • 如果返回值大于零,则表示第一个元素应该在第二个元素之后。
  • 如果返回值等于零,则表示第一个元素与第二个元素相等,它们的顺序将不确定。
int compare(const void *a, const void *b) {
    // 将指针转换为要比较的类型
    int *num1 = (int *)a;
    int *num2 = (int *)b;
    
    // 进行比较并返回结果
    return *num1 - *num2;
}


int main(void)
{
        int arr[] = {5, 2, 8, 1, 9};
        size_t len = sizeof(arr) / sizeof(arr[0]);

        qsort(arr, len, sizeof(int), compare);
}

把+ - *   /  做成回调函数 

 

函数指针的数组 

 三、指针+二维数组

int a[3][4]; //本质还是一维数组 
int[4] a[3]; //理解角度 
             //a --数组名 --代表类型 int [3][4]
             //a --代表的值 -- 首元素的地址 -- a[0] 
             //a[0] 的数据类型 int[4]
             //&a[0]--对应的数据类型 int(*)[4] //数组类型 (一维整型数组类型)
             //数组类型的指针 --- 数组指针       

int (*p)[4] = a

p:指向指针的指针,也可以看作是一个二维数组的名称

*(*(p+i) + j)  <=>    a[ i ][ j ]

*(*(p + i) + j) 是获取二维数组中第 i 行、第 j 列的元素的值。

通过将 *(p + i) 得到的指针再加上 j,得到二维数组中 (i, j) 元素的内容。最外层的 * 表示解引用,表示获取指针指向的值。

定义一个二维整型数组,找出数组最大值  

四、区分  字符指针数组 和 二维字符数组 

字符指针数组 char *s[] = {"hello", "world", "china"};

字符指针数组,每个元素都是一个指向字符的指针。

  • 在这种情况下,可以通过 s[0]s[1]s[2] 等来访问每个字符串。

 二维字符数组 char s[][10] = {"hello", "world", "china"}; 

对字符指针数组的元素进行 排序和查找

 

 

 

int a =10;

int *p =&a;

&p  ——》  int*    // p的类型

int**q = &p;

&q   ——》 q的类型为  int**

int   ***r = &q;

int a = 10;
int *p = &a;
int **q = &p;
int ***r = &q;
printf("%d", *p);   // 输出 10
printf("%d", **q);  // 输出 10
printf("%d", ***r); // 输出 10

 

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

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

相关文章

2024牛客寒假算法基础集训营1部分题解

// 能力有限&#xff0c;做多少发多少。 A-DFS搜索 题目描述 最近&#xff0c;fried-chicken完全学明白了DFS搜索&#xff08;如上图所示&#xff09;&#xff01;于是学弟向他请教DFS搜索&#xff0c;fried-chicken热心的进行了讲解&#xff1a; 所谓DFS搜索&#xff0c;就…

上海纽约大学信息技术部高级主任常潘:解密大数据引领的未来教育革命

大数据产业创新服务媒体 ——聚焦数据 改变商业 在数字化时代&#xff0c;大数据技术的应用已经深刻地改变着各行各业。特别是在教育领域&#xff0c;智慧校园建设作为现代化校园的代名词&#xff0c;正迎来大数据技术的巨大机遇。 1月17日&#xff0c;上海纽约大学信息技术部…

嵌入式软件工程师面试题——嵌入式专题(五十二)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

EtherCAT转ModbusTCP网关

一、功能概述 1.1设备简介 本产品是EtherCAT和Modbus TCP网关&#xff0c;使用数据映射方式工作。 本产品在EtherCAT侧作为EtherCAT从站&#xff0c;接TwinCAT、CodeSYS、PLC等&#xff1b;在ModbusTCP侧做为ModbusTCP主站&#xff08;Client&#xff09;或从站&#xff08;…

【蓝桥杯冲冲冲】[NOIP2003 普及组] 数字游戏

蓝桥杯备赛 | 洛谷做题打卡day25 文章目录 蓝桥杯备赛 | 洛谷做题打卡day25[NOIP2003 普及组] 数字游戏题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 [NOIP2003 普及组] 数字游戏 题目描述 丁丁最近沉迷于一个数字游戏之中。这个游戏看…

MySQL for update锁表还是锁行校验

select * from user where id 1 for update ; 1. for update作用 在MySQL中&#xff0c;使用for update子句可以对查询结果集进行行级锁定&#xff0c;以便在事务中对这些行进行更新或者防止其他事务对这些行进行修改。 当使用for update时&#xff0c;锁定行的方式取决于wh…

【初中生讲机器学习】4. 支持向量机算法怎么用?一个实例带你看懂!

创建时间&#xff1a;2024-02-02 最后编辑时间&#xff1a;2024-02-03 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

【八大排序】冒泡排序 | 快速排序 + 图文详解!!

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 交换排序一、冒泡排序1.1 算法步骤 动图演示1.2 冒泡排序的效率分析1.3 代码实现1.4 …

HSRP配置指南

实验大纲 第 1 部分&#xff1a;验证连通性 步骤 1&#xff1a;追踪从 PC-A 到 Web 服务器的路径 步骤 2&#xff1a;追踪从 PC-B 到 Web 服务器的路径 步骤 3&#xff1a;观察当 R3 不可用时&#xff0c;网络的行为 第 2 部分&#xff1a;配置 HSRP 主用和 备用路由器 步…

【Crypto | CTF】BUUCTF rsarsa1

天命&#xff1a;第二题RSA解密啦&#xff0c;这题比较正宗 先来看看RSA算法 这道题给出了 p&#xff0c;q&#xff0c;E&#xff0c;就是给了两个质数和公钥 有这三个东西&#xff0c;那就可以得出私钥了 最后把私钥和质数放进去解密即可得到解密后的明文 from gmpy2 impor…

公交最短距离-算法

题目 给定一个一维数组&#xff0c;其中每一个元素表示相邻公交站之间的距离&#xff0c;比如有四个公交站A,B,C,D&#xff0c;对应的距离数组为&#xff0c;1,2,3,4&#xff0c;如下图示 给定目标站X和Y&#xff0c;求他们之间最短的距离 解题 遍历一次整个数组&#xff0c;…

考研/计算机二级数据结构刷题之顺序表

目录 第一题 顺序表的初始化&#xff0c;销毁&#xff0c;头插&#xff0c;尾插&#xff0c;头删&#xff0c;尾删&#xff0c;指定位置插入&#xff0c;指定删除以及打印 第二题 移除元素 题目链接&#xff1a; OJ链接 题目详解&#xff1a;移除元素 第三题&#xff1a;删…

回溯法:回溯法通用模版汇总以及模版应用

从一个问题开始 给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4] ] 很容易想到 用两个for循环就可以解决。 如果n为100&#xff0c;k为50呢&#xff0c;那就50层for循…

问题:测风站应设置在平直的巷道中,其前后()范围内不得有障碍物和拐弯等局部阻力。 #微信#媒体

问题&#xff1a;测风站应设置在平直的巷道中&#xff0c;其前后&#xff08;&#xff09;范围内不得有障碍物和拐弯等局部阻力。 参考答案如图所示

U盘里的东西刚存进去就没了怎么回事?怎么办

U盘里的东西刚存进去就没了怎么办&#xff1f;U盘是我们平时常用的存储设备之一&#xff0c;但有时候会出现一些问题。其中之一就是将东西存进去后&#xff0c;发现数据竟然消失了。这是一个令人困扰的问题&#xff0c;可能会导致我们的重要文件丢失。在本文中&#xff0c;我们…

RT-Thread线程管理(使用篇)

layout: post title: “RT-Thread线程管理” date: 2024-1-26 15:39:08 0800 tags: RT-Thread 线程管理(使用篇) 之后会做源码分析 线程是任务的载体&#xff0c;是RTT中最基本的调度单位。 线程执行时的运行环境称为上下文&#xff0c;具体来说就是各个变量和数据&#xff0c…

利用OpenCV实现物流与生产线自动化的革命性突破

背景介绍&#xff1a; 在当今高度自动化的时代&#xff0c;物流和生产线上的每一个环节都关乎企业的核心竞争力。传统的生产方式往往依赖于人工检测和操作&#xff0c;这不仅效率低下&#xff0c;而且容易出错。为了解决这一问题&#xff0c;越来越多的企业开始寻求利用计算机视…

流畅的Python(七)-函数装饰器和闭包

一、核心要义 主要解释函数装饰器的工作原理&#xff0c;包括最简单的注册装饰器和较复杂的参数化装饰器。同时&#xff0c;因为装饰器的实现依赖于闭包&#xff0c;因此会首先介绍闭包存在的原因和工作原理。 二、代码示例 1、变量作用域规则 #!/usr/bin/env python # -*-…

记录一次使用ant design 中 ConfigProvider来修改样式导致样式改变的问题(Tabs嵌套Tabs)

一 说明 继之前的一篇文章&#xff1a;antd5 Tabs 标签头的文本颜色和背景颜色修改 后&#xff0c;发现在被修改后的Tab中继续嵌套Tabs组件&#xff0c;这个新的Tabs组件样式跟外层Tabs样式也是一致的&#xff0c;如下图所示&#xff1a; 二 原因 在修改外层tabs样式时&…

学习Spring的第十三天

非自定义bean注解开发 设置非自定义bean : 用bean去修饰一个方法 , 最后去返回 , spring就把返回的这个对象,放到Spring容器 一 :名字 : 如果bean配置了参数 , 名字就是参数名 , 如果没有 , 就是方法名字 二 : 如果方法产生对象时 , 需要注入数据 , 在方法参数设置即可 , …