![](https://img-blog.csdnimg.cn/20201231102244322.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C进阶
文章平均质量分 65
本专栏适合有一定基础的C语言学习者,本人极力简化,突出重点。参考书籍:C程序设计语言_第2版-K&R(徐宝文等译)。如果你没有读过,建议购买一本和答案,我相信绝对事半功倍。
ve2102388688
这个作者很懒,什么都没留下…
展开
-
C语言中小数转字符串?标准C?
小数转字符串写之前,先来看看标准C?1 小数转字符串--标准C1 小数转字符串--非标准C写之前,先来看看标准C?其实,很多时候我们都会混淆一个概念:标准C?这里简要分享下,标准C其实就是ANSI C标准,里面收纳了绝大部分函数,但是人们发现有些经常使用的API没有被收纳,比如今天的主题–小数转字符串,所以这一部分函数叫做非标准C,实际上:标准C和非标准C同等重要,现在也被大多数编译厂商收录,也就是现在编译器(既有标准C,也有非标准C),导致很多人不区分它们,成为C库。不过遗憾的是,标准委员会从C9原创 2021-04-02 16:35:37 · 4812 阅读 · 0 评论 -
C语言如何传入二维数组
C语言如何传入二维数组咋一看,顺手就写出下面的代码2 修改3 把二维数组当成一维数组用4 其他方式5 需要传入二维数组吗?咋一看,顺手就写出下面的代码下面就一个矩阵的加法演示可能出现的问题void addMatrix(int row, int col, int **a, int **b, int **c) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { c[i原创 2021-03-24 20:30:19 · 4101 阅读 · 0 评论 -
C/C++ 二进制转十进制
二进制转十进制1 代码1 代码int getDecimalValue2(vector<int>& binary) { int ans = 0; for(int i = 0; i < binary.sizze(); ++i) { ans = (ans<<1) + binary[i]; } return ans;}思路:把整个二进制串想成两部分,当前处理的这1位。前面一个整体。当然没处理的串不算哈当然,移进一位,前面的整体*2,相当于前面原创 2021-01-28 17:32:29 · 2137 阅读 · 0 评论 -
C/C++ 二维数组第一列升序,第一列相同第二列降序
二维数组排序数组排序有内置API,一般是一维的,这里分享下二维或者多维的用法1 C++ 二维数组第一列升序,第一列相同第二列降序2 C 二维数组第一列升序,第一列相同第二列降序3 更一般的思路数组排序有内置API,一般是一维的,这里分享下二维或者多维的用法下面先分享下C++的情况,C++有好几个排序API,其内部实现一般是快排,包括稳定、不稳定、部分排序等。1 C++ 二维数组第一列升序,第一列相同第二列降序这里使用sort来完成,默认是升序,不管是一维,二维,多维,没有第三个参数都是按第一列升序排原创 2021-01-22 14:43:11 · 2670 阅读 · 1 评论 -
C/C++矩阵翻折与旋转
矩阵翻折与旋转二维数组就地操作,n*n2 矩阵水平翻折3 矩阵左右翻折4 矩阵主对角线翻折5 矩阵副对角线翻折7 矩阵顺时针旋转90度8 矩阵逆时针旋转90度9 自己画一个矩阵,按结论套下就懂了二维数组就地操作,n*n2 矩阵水平翻折规律:行和是n-1,行减半;列不变 for (int i = 0; i < n/2; ++i) { for (int j = 0; j < n; ++j) { swap(&matrix[i][j], &a原创 2021-01-08 17:01:01 · 1665 阅读 · 0 评论 -
C/C++二维数组分块遍历
二维数组分块遍历1 二维数组分块遍历2 简单的按行遍历,按列遍历3 分块遍历3.1 除法,求余的物理意义3.2 何为遍历?3.3 确定数组行下标3.3 确定数组列下标3.3 完整代码3.4 技巧1 二维数组分块遍历对于二维数组,默认是行遍历的(这种场景最常见),有时候也需要按列遍历,还有些时候需要按分块矩阵顺序遍历。遍历:简单地讲,将每个元素有且仅有执行一次。分块遍历,如9*9的矩阵,每3*3一块,这样划分下来只有9个大矩阵,9个大矩阵是按行遍历的。目标:按照图中所示的数字顺序遍历。2 简单的原创 2021-01-08 10:45:19 · 1537 阅读 · 2 评论 -
C/C++各种类型说明符占用存储空间,如int、long、double占用的字节数
类型说明符占用存储空间对于特定位数的机器,类型说明符占用的大小一致,下面用的C++,没有写C代码1 我的是64位机器,至于32位机器是怎么样,可以用32位机器试下2 解释3 second.cpp对于特定位数的机器,类型说明符占用的大小一致,下面用的C++,没有写C代码1 我的是64位机器,至于32位机器是怎么样,可以用32位机器试下还是看下代码吧,不然无法理解,比如,时不时有人会提到32767,又有人说int占用4字节,甚至把两者等同起来,这是错误的。结论是:32767的时代已经过时了,还是要仔细分原创 2021-01-07 11:10:08 · 1839 阅读 · 0 评论 -
C/C++如何忽略定义了但是未使用的变量
忽略定义了但是未使用的变量1 GCC编译中警告不等于错误,但有些警告所有编译器都认为是错误2 一个案例3 忽略定义了但是未使用的变量1 GCC编译中警告不等于错误,但有些警告所有编译器都认为是错误下面提及几点,明明定义了返回值,但是不返回形参、实参类型不匹配,无法进行隐式转换编译器最初会给出警告,至于是不是错误,我认为有两点主要原因编译器厂商共同约定的,某些警告就是错误程序员可以附加其他错误项,比如你就认为某个警告就是错误啦至于我们需不需要将所有的警告全部消灭,看个人和项目要求,但是原创 2021-01-06 15:25:15 · 3456 阅读 · 1 评论 -
C语言调用shell命令及获得环境变量的内容
调用shell命令,获得环境变量的内容C语言是靠底层的高级语言,和系统有关的操作都提供一些API1 执行shell命令system2 获得环境变量的内容C语言是靠底层的高级语言,和系统有关的操作都提供一些API1 执行shell命令system将字符串传递给执行环境,其结果与具体实现有关,比如,Linux下想执行ls命令,system("ls"); // 执行命令再比如,windows下,我们经常遇到这样的代码system("p原创 2021-01-06 14:52:08 · 689 阅读 · 0 评论 -
C语言如何使用时间time
时间time1 头文件1 头文件<time.h>,获取当前本地时间C语言给我们提供了时间,对于一般的任务是足够。下面最要程度依次降低。获取本地时间,十分简单,就两个函数,如下。 time_t t = time(0); printf("%s\n", ctime(&t)); // 输出当前时间,注意,已经localtime了 //output Wed Jan 6 10:38:18 2021下面介绍下这两个函数。tim原创 2021-01-06 14:29:50 · 2245 阅读 · 0 评论 -
C/C++中大小端判断
大小端判断1 什么是大端、小端?2 两种简单的方式判别大小端2.1 使用union的特性2.2 强转成char*3 指针的强大1 什么是大端、小端?整数的表示作为计算机入门的第一步,在计算机内部用0、1表示,存储顺序有两种,分别是小端、大端小端序(little-endian)是指将表示整数的低位字节存储在内存地址的低位,高位字节存储在内存地址的高位。相反大端序(big-endian)低字节存储在内存的高位。一个例子下标是一个内存地址,从0x100开始的哈2 两种简单的方式判别大小端2.1原创 2021-01-05 19:15:19 · 1275 阅读 · 0 评论 -
C/C++使用异或交换元素及固有的缺点
异或交换元素1 如何使用异或来交换元素2 扩展,一组数,只有一个数出现一次,其他数出现两次,求出现一次的这个数?3 一组数,只有一个数出现一次,其他数出现三次,求出现一次的这个数?1 如何使用异或来交换元素代码如下/** \brief swap 异或交换两元素 * \author xxx * \copyright GNU Public License * \version 1.0 * \date 2020-1-4 * * \param[原创 2021-01-04 21:25:23 · 414 阅读 · 0 评论 -
如何理解C/C++语言的优先级,需要背吗?
C语言优先级1 如何理解C语言优先级,需要背下来吗?2 记住最高优先级的四个3 ++ -- 属于第一还是第二梯队4 * & 属于第二梯队5 几个案例6 总结7 C++在四大最高优先级上还有一个作用域解析符::1 如何理解C语言优先级,需要背下来吗?很多初学者都是在背C语言优先级顺序表和结合型方式(左结合or右结合),其实不需要,如何就背下来的话,那么把++、.、->、[]这些混在一起,这时继续背?还是必须解决这个问题?看似表的内容很多,其实你只需要记住一点就好了,下面我和大家分享下。2原创 2021-01-04 19:29:25 · 695 阅读 · 0 评论 -
C语言中static的理解
static的理解1 如何理解static?2 加上static改变了什么?2.1 static的存储类型解释3 加上static后带来了什么优点?4 总结1 如何理解static?static在很多的地方都能看见。那么怎么准确把握它含义呢?其实我把这个问题分成两个点, 1. 加上static改变了什么?2. 加上static后带来了什么优点?2 加上static改变了什么?最容易理解的答案是:将变量私有化,即具有内部连接属性由于static作用变量的作用域不同,所有static变量细分几种原创 2021-01-04 16:33:48 · 1608 阅读 · 0 评论 -
C/C++计算复数的模长API
计算复数的模长1 复数的表达2 计算复数的模长1 复数的表达实际上,在C语言是没有复数库的,一般而言,可以定义一个结构体struct complex { double real; double imag;};而C++是有复数库#include <complex> ,它是一个模板库,在模板中一个设计思路是,先设计主模板库—Primary template之后再分别实例化—Specializations比如,这里就简单的提及下,这里只讲C哈。// Primary temp原创 2020-12-31 16:56:45 · 1914 阅读 · 0 评论 -
C语言计算商和余数div
商和余数1 利用API计算商和余数2 利用求余和取模运算1 利用API计算商和余数这里要分享的利用内置API哈,因为这个确实很多种方法一共有两个函数,一个适合int、一个适合long而言返回的结构体div_t有两个元素,商是quot;余数remdiv_t div(int num, int denom);ldiv_t ldiv(long num, long denom);比如:5/3 = 1 ... 2 // num/denom=quot...rem使用案例: div_t re原创 2020-12-31 16:02:53 · 6698 阅读 · 1 评论 -
C语言宏替换#define中的#和##以及\
#define中的#和##1 #替换2 ##连接2 \代表是一行代码1 #替换在#define中,有两个特殊的符号,他们是#和##// 下面含义代表name的真实含义#name 具体过程:1. 现在name左右加上引号,表达成字符串2. 将name换成真实的实参例如#define MYREPLACE(dir) #dir "/%s" // # 替换printf("%s\n", MYREPLACE(/usr/local));Output,输出/usr/local/%s原创 2020-12-31 15:44:29 · 1227 阅读 · 0 评论 -
C语言预处理命令#line、#error、#pragma、#ifndef等
C语言预处理命令1 我想把预处理命令分成3类2 三个陌生命令2.1 #line行控制2.2 #pragma留给具体实现2.3 #error错误信息输出2.4 #ifxxx条件编译2.4 书写语法1 我想把预处理命令分成3类如下3块内容1. 以#define、#include的宏替换和文件包含2. 以#ifxxx为首的一族条件编译命令3. 其他三个陌生命令,如#line、#error、#pragma 总结:第一点我们很熟悉,不在这里分析。但是涉及两个特殊用法,即#和##,之后分享第二点是条件编原创 2020-12-31 11:24:02 · 1116 阅读 · 0 评论 -
一个简单的C语言调试信息 __FILE__、__LINE__、__DATE__、__TIME__
C语言预定义名字1 5个C语言预定义名字2 案例1 5个C语言预定义名字下面的五个预定义名字不可取消定义也不可以重定义!!!名字含义__LINE__指示当前所在行数、十进制常量。结果受#line的影响!__FILE__当前源文件文件名__DATE__编译日期__TIME__编译时间__STDC__是否遵循标准,是值为1,否则为0前面四个应用非常广泛,比如:编译错误提示输出信息,内核编译时间等2 案例printf("ERROR inform原创 2020-12-31 10:17:21 · 235 阅读 · 0 评论