C/C++基础
文章平均质量分 54
C/C++基础语法等
ccJun-
这个作者很懒,什么都没留下…
展开
-
类内sort自定义排序函数需定义为static否则报错
目录1. 使用sort算法自定义排序的几种方法及类内实现出现的问题2. sort部分源码:1. 使用sort算法自定义排序的几种方法及类内实现出现的问题sort算法默认使用元素类型的 ‘<’ 运算符,但是当我们希望的排序顺序与 ‘<’ 所定义的顺序不同,或者我们的序列是未定义 ‘<’ 运算符的元素类型,这两种情况下,都需要重载sort的默认行为。通常,我们通过自定义一个cmp函数(官方称为谓词)作为sort的第三个参数来指定我们指定的排序规则,举例如下:输入:给定一个二维数组env原创 2021-08-16 20:56:23 · 2088 阅读 · 2 评论 -
C程序函数调用机制详解,看完必会!
C程序调用机制1. 栈帧结构和控制转移权方式2. 函数调用举例参考文献:函数调用操作包括从一块代码到另一块代码之间的双向数据传递和执行控制转移。数据传递是通过函数参数和返回值来进行。另外,我们还需要在进入函数时为函数的局部变量分配存储空间,并在退出函数时收回这部分空间。Intel 80x86 CPU为控制传递提供了简单的指令,而数据的传递和局部变量存储空间的分配与回收则通过栈操作来实现。1. 栈帧结构和控制转移权方式大多数CPU上的程序实现使用栈来支持函数调用操作。栈被用来传递函数参数、存储返回信息、原创 2021-08-08 18:44:18 · 1461 阅读 · 0 评论 -
Linux C 存储空间布局
目录1 .text段(代码段)2 .data段(初始化数据段)3 .bss段(未初始化数据段)4 栈(stack)5 堆(heap)注:注.1 静态存储区注.2 所有字符串常量均存储在静态存储区1 .text段(代码段)用来存放程序执行代码的一块内存区域,是由CPU执行的机器指令部分,通常是可共享的,所以即使是频繁执行的程序(如文本编辑器、C编译器和shell等)在存储器中也只需要有一个副本。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。原创 2021-07-16 14:01:29 · 349 阅读 · 1 评论 -
C语言各种类型之间转换详解
目录1. C基本类型变量2. 符号扩展2.1 规则一:2.2 规则二:2.3 规则三:3. 零扩展4. 长类型转换为短类型5. 自动类型转换5.1 赋值时的类型转换5.2 运算时的类型转换6. 有符号和无符号数的比较6. 无符号数回绕参考资料:1. C基本类型变量char/short/int/long/long long 以及其对应的无符号类型,short/double等。基本类型输出格式符char%c, %d, %ushort%hdint%dlong%l原创 2021-07-15 15:50:18 · 5023 阅读 · 0 评论 -
如何解决递归中的重复计算(重叠子问题)
递归是一种自顶向下的、很直观的编程方法,解释性强。但在写递归的时候,最关键的问题是怎样避免递归过程中可能产生的大量重复计算,即重叠子问题,否则,写出来的代码即便没有逻辑错误,也几乎会因为超时无法运行。所以说,一旦选择了递归,基本上都要连同做后续的优化工作,这也是本文主要探讨的话题。由于递归代码是很容易写的,这篇文章要做的是在写好暴力递归之后,怎样进行优化,以避免重复计算。下面通过几个简单的例子说明(题目来自力扣):提示:不要关注题目内容,直接对比暴力递归代码和优化后代码,很容易找到优化套路,就在暴力基础原创 2021-05-26 10:09:10 · 2697 阅读 · 0 评论 -
C++STL库中sort函数用法(转载)
C++STL库中sort函数用法转载 2021-05-23 20:31:02 · 146 阅读 · 0 评论 -
c++优先队列(priority_queue)
优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。详见文末参考博客。对于queue和priority_queue,其基本操作的差别:queue可通过front()方法、back()方法分别访问队首、队尾元素,而priority_queue没有上述两种方法,只能通过top()方法访问队首元素。参考博客:c++优先队列(priority_queue)用法详解...原创 2021-05-19 23:09:26 · 229 阅读 · 0 评论 -
c++ vector常用操作
目标: 实现vector容器内元素的反转,如由[1 2 3 4]变为[4 3 2 1]方法1:使用<algorthm>中的reverse()代码1:#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){ vector<int> v1{1,2,3,4}; reverse(v1.begin(), v1.end()原创 2021-05-17 19:31:17 · 5433 阅读 · 4 评论 -
整型与字符型运算
整型与字符型相加得到整型整型与字符型相加得到字符型原创 2021-05-10 19:41:12 · 2342 阅读 · 0 评论 -
C语言中的“>>”和“<<”
C语言中的“>>”和“<<”转载 2021-04-16 13:05:44 · 793 阅读 · 0 评论 -
格式化字符串函数sprintf与snprintf
菜鸟教程中关于这两个函数的说明如下:C 库函数 - sprintf()C 库函数 - snprintf()sprintf声明:int sprintf(char *str, const char *format, …)描述:C 库函数 int sprintf(char *str, const char *format, …) 发送格式化输出到 str 所指向的字符串。参数:str – 这是指向一个字符数组的指针,该数组存储了 C 字符串。format – 这是字符串,包含了要被转载 2021-04-06 21:42:25 · 363 阅读 · 0 评论 -
函数指针与指针函数
1. 函数指针如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。声明格式:函数返回值类型 (* 指针变量名) (函数参数列表)int (*fun)(int x,i nt y);int (*fun)(int, int)原创 2021-03-31 20:41:56 · 187 阅读 · 0 评论 -
dji osdk ros源码中demo代码枚举双冒号报错
如下图,为dji ros osdk中一个demo的源码,IDE为vscode,报错如下:经查找,红线部分前面的DJISDK为dji_sdk.h中定义的namespace,所以其后面用双冒号无可厚非。如下:但是报错部分为该namespace中定义的枚举,报错提示双冒号用于类名或namespace,所以直接去掉红线部分即可,如下:...原创 2021-03-29 15:28:20 · 197 阅读 · 0 评论 -
strlen和sizeof的区别
本文转载自:strlen和sizeof的区别C语言中没有字符串,用的是字符数组来模拟字符串。C风格的字符串时字符数组然后在末尾加0表示结尾。在C语言中有strlen和sizeof两个函数求字符数组的长度函数,他们俩的区别就是是否把最后的结束标志也加上去。strlen是不加的,他表示字符串的长度。而sizeof求的是字符串在内存中的长度,所以它是加上最后的’\0’的所以一般而言后者的长度会比前者多1。#include<stdio.h>#include<string.h>转载 2021-01-13 14:29:45 · 428 阅读 · 0 评论 -
memset与bzero初始化
本文转载自:memset函数及其用法,C语言memset函数详解在前面不止一次说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”。每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。它是直接操作内存空间,mem即“内存”(memory)的意思。该函数的原型为:# include <string.h>void原创 2021-01-13 11:13:08 · 514 阅读 · 0 评论 -
函数声明后面的const用法
函数声明后面的const用法转载 2021-01-08 21:24:24 · 208 阅读 · 0 评论 -
c++中关于return的用法总结
c++中关于return的用法总结转载 2021-01-08 15:37:51 · 4655 阅读 · 0 评论 -
c++编译器为什么不支持模板的分离式编译
c++编译器为什么不支持模板的分离式编译转载 2021-01-08 10:14:43 · 102 阅读 · 0 评论 -
vscode+cmake下debug报错Target debugging is no longer supported with the legacy driver
原因: cmake版本过低的问题,cmake tools的开发者表示目前只能支持3.7.2以上版本的cmake进行一键debug功能.查看当前cmake版本: 终端运行命令 cmake --version安装3.9.1版本参考下面的文章:https://blog.csdn.net/u010472607/article/details/76166008...原创 2020-10-21 16:59:54 · 1607 阅读 · 0 评论 -
C++中数组作为函数参数时为什么要传入数组长度
例子:将任意长度的整形数组传递给求和函数sum,返回数组中所有元素之和。写法1:#include <iostream>using namespace std;int sum(int arr[]){ int sum = 0; int len = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i < len; i++) { sum += arr[i]; } return sum;}int main(){ int原创 2020-12-01 20:05:14 · 2508 阅读 · 2 评论