![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言的学习历程
ALfirewell
本人的目标是当一名嵌入式研发工程师,会把自己学习的历程以及自己的发现和心得记录下来,但愿最后能如愿以偿。
展开
-
static inline对函数的作用
在阅读代码的时候我们经常会看到这样的函数原型:static inline char sdsReqType(size_t string_size) { if (string_size < 32) return SDS_TYPE_5; if (string_size < 0xff) return SDS_TYPE_8; if (string_size < 0xffff) return SDS_TYPE_16; i原创 2020-11-03 00:53:41 · 7277 阅读 · 2 评论 -
快速排序的实现和总结
快速排序是在面试中经常被问到的一种排序,首先来介绍一下它的基本思想:选取一个哨兵(通常选择最左边的那个)作为一个关键元素,然后通过排序使得哨兵处于一个这样的位置:哨兵左边的数都比它要小,右边的数都比它要大,然后对其左边和右边的集合同样进行这样的操作,直至左右区间只有一个数为止。void quick_sort(int * data, int left, int right){ int i,j, key; if(left > right) return ; key = data[left]原创 2020-09-13 17:47:33 · 91 阅读 · 0 评论 -
希尔排序的实现与总结
希尔排序是经过分组的插入排序,那么怎么理解呢?在此之前我们先来再次认识一下插入排序。我们可以看到对于插入排序,前面的元素都是有序的,后面有新的元素插入进来时我们只需要找到对应的位置插入进来即可。void insert_sort(int * data, int length){ int i, j, temp; for(i = 1; i < length; i++) { temp = data[i]; for(j = i - 1; temp < data[j]; j--)原创 2020-09-13 14:39:47 · 193 阅读 · 0 评论 -
双向循环链表的创建和删除
#include <stdio.h>#include <stdlib.h>#include <string.h>#define LEN sizeof(Node)typedef struct Node{ char name[10]; struct Node *next; struct Node *prev;}Node,*Li...原创 2018-08-12 23:11:38 · 248 阅读 · 0 评论 -
用e为底来表示的浮点常量的写法与要求
书写浮点常量有多种选择,,基本形式:包含小数点的一个带符号的数字序列,接着是字母e或E,然后是一个代表10的指数的有符号值,且必须为整数。 例如: -1.56E+12; 2.87e-3; -8e1.0;错 可以省略正号,可以没有小数点或指数部分。 例如: 2E5; 19.28; 但是不能同时没有二者。 例如: -080;错 可以省略小数或者整数部分,但不能同时省略。 注...原创 2018-08-12 14:30:17 · 21575 阅读 · 3 评论 -
指针数组 数组指针详解
关于指针数组和数组指针,是很多刚开始学C语言的人都很头疼的问题,我也不例外,最近我专门把这块做了一个总结,来和大家一起分享,有什么问题或者疑惑也可以在下方评论或者私信我。我主要是通过代码来使大家加深这块的印象,在这之前,先来了解一下这两个的概念。数组指针:本质上还是一个指针,它是一个指向数组的指针。 指针数组:本质上是一个数组,数组中的每个元素都是指针类型。#include<s...原创 2018-08-11 21:29:16 · 438 阅读 · 0 评论 -
循环队列的各种操作
#include <stdio.h>#include <stdlib.h>#define LEN sizeof(SqQueue)#define MAXSIZE 10typedef struct { int data[MAXSIZE]; int front; int rear;}SqQueue;SqQueue *Q;void I...原创 2018-08-14 23:23:21 · 217 阅读 · 0 评论 -
用函数来实现字符串的各种操作
int len() { char a[20]; printf(“显示字符串的长度\n”); printf(“请输入一个字符串:”); scanf(“%s”,a); int i=0; while(a[i]!=’\0’) i++; printf(“%d”,i); return 0; }int triple...原创 2018-08-10 16:43:13 · 296 阅读 · 0 评论 -
字符数组和字符指针的区别
我们经常会碰到这样的问题: char *p = “xyz”; char *q = “xyz”; char pa[] = “xyz”; char qa[] = “xyz”; 以下说法正确的是: A、p和q指向同一块地址 B、p和q的内容可以修改 C、pa内容修改后qa的内容也被修改 D、pa和qa指向同一块地址正确答案:D分析: p和q是指针,指向同一块字符串常量区,内容...原创 2018-08-10 11:11:37 · 221 阅读 · 0 评论 -
系统的大端模式与小端模式
大端模式:高字节存放高地址 小端模式:高字节存放低地址 下面举个例子: 有int型数据0x12345678存放在地址0x00开始处,则大小端存放方法见下图 那么怎么验证系统是大端还是小端模式呢? 下面推荐两种方法: 1.用联合体来验证:include <stdio.h>int checknum(){ union check { ...原创 2018-08-10 10:45:25 · 314 阅读 · 0 评论 -
陷阱之有符号无符号字符型数组
请看下面这段代码:#include <stdio.h>#include <string.h>int main(){ char a[1000]; int i; for(i=0;i<1000;i++) { a[i]=-10-i; } printf("%d\n",strlen(a)); print...原创 2018-08-10 09:54:27 · 2352 阅读 · 2 评论 -
C/C++引用必须为左值的问题详解
我们常常会遇到这样的问题: const int&amp; a = 101;//对 int&amp; b = 101;//错例子: int a; int &amp;b = a; a = 10; printf(“b = %d\n”,b); 此时b = 10,b是a的引用,就是说b和a的地址相同,对a做改变b也跟着变化。 那么这是为什么呢? 下面我们...原创 2018-08-10 09:27:47 · 2617 阅读 · 0 评论 -
使用write函数遇到的问题
write有两种用法。一种是:ssize_t write(int fd, const void *buf, size_t nbyte); fd:文件描述符; buf:指定的缓冲区,即指针,指向一段内存单元; nbyte:要写入文件指定的字节数; 返回值:写入文档的字节数(成功);-1(出错) write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错...原创 2018-04-26 20:25:46 · 3937 阅读 · 0 评论 -
静态与局部的区别与选择
静态全局变量和普通全局变量的区别: 相同点: 静态全局变量和普通全局变量都存放在全局数据区,如果不初始化的话默认值都为0。 不同点: 作用域不同: 普通全局变量的作用域是整个工程,也就是整个工程中的不同文件可以共享全局变量,而静态全局变量的作用域只包含它自己的源文件,在其他源文件中是不能访问它的。静态局部变量和普通局部变量的区别: 1.存储位置不同: 静态局部变量存储在全局数据区...原创 2018-04-20 23:43:06 · 282 阅读 · 0 评论 -
文件隐藏属性chattr,lsattr
有时为了满足特定的要求,需要为文件设置特殊的属性,也就是隐藏属性。 下面我来列举一下两个比较重要的隐藏属性。 我们可以通过chattr来设置文件隐藏属性 例如: chattr -i 文件名 通过-i参数对文件的设置,可以使该文件不能被删除,更名,设置连接也无法写入或者添加数据。 注意:只有root才能设置此属性。 chattr -a 文件名 通过-a参数的设置,可以使文件只能增加数...原创 2018-04-20 12:06:18 · 316 阅读 · 0 评论 -
文件与目录的默认权限
文件默认权限:umask umask就是指目前用户在新建文件或目录的时候的默认权限。[root@localhost 文件]# umask 0022 [root@localhost 文件]# umask -S u=rwx,g=rx,o=rx直接输入umask,显示的是数字形态的默认权限。 那么它代表什么意思呢? 在Linux中,文件不应该有执行的功能,所以文件的最大权限为666,...原创 2018-04-20 11:51:40 · 654 阅读 · 0 评论 -
不带头结点的链表的增删改查
#include <stdio.h>#include <stdlib.h>#define LEN sizeof(struct student)struct student{ char name[10]; int age; struct student *next;};struct student *head = NULL;voi...原创 2018-08-12 20:20:35 · 276 阅读 · 0 评论 -
带头结点的链表的各种操作
#include &lt;stdio.h&gt;#include &lt;string.h&gt;#include &lt;stdlib.h&gt;#include &lt;math.h&gt;#include &lt;time.h&gt;#define LEN sizeof(Node)typedef struct Node{原创 2018-08-12 20:21:24 · 261 阅读 · 0 评论 -
给定一个正整数n,求出0到n中有几个数满足其二进制表示不包含连续的1
样例:输入:5 输出:50 01 10 100 101满足,11不满足。那么6144呢?答案是610,怎么去计算呢?思路:查找从0到n中有多少个数包含连续的1,然后在总数中去掉这些情况,得到的就是结果。请看下面求解的代码:#include <stdio.h>int cnt = 0;void fun(int m){ int flag = 0; w...原创 2018-10-23 17:31:23 · 1366 阅读 · 0 评论 -
C语言实现求一个字符串的最长回文字串 动态规划
求解思路:回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串,那么P[i+1,j-1]也是回文字符串。这样最长回文子串就能分解成一系列子问题了。这样需要额外的空间O(N2),算法复杂度也是O(N2)。首先定义状态方程和转移方程:P[i,j]=0表示子串[i,j]不是回文串。P[i,j]=1表示子串[i,j]是回文串。P[i,i]=1P[i,j]{=...原创 2018-10-19 20:42:07 · 2052 阅读 · 0 评论 -
排序之时间复杂度和空间复杂度总结
排序方法 平均时间复杂度 最好 最差 空间复杂度 稳定度 冒泡排序 o(n^2) o(n) o(n^2) o(1) 稳定 选择排序 o(n^2) ...原创 2018-08-21 13:18:10 · 1055 阅读 · 0 评论 -
数据结构——7种排序——示例
#include <stdio.h>#define MAXSIZE 10typedef struct { int r[MAXSIZE]; int length;}SqList;void swap(SqList *L, int i, int j){ int temp = L -> r[i]; L -> r[i] = L -&g...原创 2018-08-21 12:32:06 · 404 阅读 · 0 评论 -
数据结构之二叉树的各种操作
#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#define LEN sizeof(struct BiTNode)typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild;}*BiTree;void InitBiTree(BiTree *T...原创 2018-08-23 10:02:16 · 216 阅读 · 0 评论 -
链栈的各种操作
#include <stdio.h>#include <stdlib.h>#define LEN1 sizeof(StackNode)#define LEN sizeof(LinkStackPtr)typedef struct StackNode{ int data; struct StackNode *next;}StackNode,*Li...原创 2018-08-13 20:53:18 · 232 阅读 · 0 评论 -
C语言普通栈的各种操作
#include <stdio.h>#include <stdlib.h>#define LEN sizeof(SqStack)#define MAXSIZE 10typedef struct { int data[MAXSIZE]; int top;}SqStack;SqStack *S;void InitStack(){ ...原创 2018-08-13 19:44:30 · 275 阅读 · 0 评论 -
C语言共享栈的各种操作
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 10#define LEN sizeof(SqDoubleStack)typedef struct { int data[MAXSIZE]; int top1; int top2;}SqDoubleStack;SqDouble...原创 2018-08-13 19:23:09 · 365 阅读 · 0 评论 -
Linux C采用makefile进行多文件编译时对全局变量的用法
我们刚开始学习makefile进行多文件编译时常常会遇到这样的问题:你想在多文件中定义一个全局变量来实现在不同的文件中,只要该变量的值在其中一个文件改变,其他相应的文件中该变量的值也变成那个值。 但是刚开始常常会遇到问题,主要的问题就是你的全局变量声明和定义的地方不对。 首先要理解这些概念 1.定义需要分配存储空间 2.初始化是定义变量时候赋给变量的值; 3.赋值是以后用到该变量,赋给该...原创 2018-08-08 19:50:25 · 868 阅读 · 0 评论 -
栈的基本操作
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 5#define LEN sizeof(SqStack)typedef struct { int data[MAXSIZE]; int top;}SqStack;SqStack *S;void InitStack(){ ...原创 2018-08-13 11:17:57 · 197 阅读 · 0 评论 -
单链表的断链逆序
#include <stdio.h>#include <stdlib.h>#include <string.h>#define LEN sizeof(Node)struct student{ char name[10]; struct student *next;}Node;struct student *head = NUL...原创 2018-08-12 23:12:46 · 485 阅读 · 0 评论 -
C语言链队的各种操作
#include <stdio.h>#include <stdlib.h>#define LEN sizeof(Node)#define LEN1 sizeof(LinkQueuePtr)typedef struct Node{ int data; struct Node *next;}Node,*LinkQueue;typedef st...原创 2018-08-15 10:56:46 · 476 阅读 · 0 评论 -
C语言中的变长数组
学过C语言和C++的人都知道,我们在定义数组时用的都是整型的常量,那么大家有这样去定义过一个数组吗?#include <stdio.h>int main(int argc, char **argv){ int c, d,i,j; scanf("%d %d",&c,&d); int m[c][d]; for(i = 0;i &...原创 2018-04-06 22:14:44 · 3193 阅读 · 0 评论 -
Linux修改文件权限以及属性的方法
上次讲到怎么查看文件的权限以及文件的属性,那么在一些场合你要修改文件的属性和权限怎么办呢? 我们可以使用下面3个命令来修改文件的属性和权限: chgrp(change group):改变文件所属用户组 chown(change owner):改变文件所有者 chmod(change mode):改变文件的权限 那么到底是怎么实现的呢? 例如: [root@localhost 文件]#...原创 2018-04-18 16:27:12 · 714 阅读 · 1 评论 -
C语言学习的第三天(续)
例11:int main() { char a[]=”china”; printf(“%d”,sizeof(a)); printf(“%d”,strlen(a)); return 0; } 这个程序让我们知道了strlen和sizeof的区别。 例12:int main() {int a[5][5]={0};change(a);re原创 2017-12-06 01:24:04 · 264 阅读 · 0 评论 -
C语言的经典面试题
例1:int main() { int i,k; for(i=0;k=1;i++,k++) { printf(“%d,%d”,i,k); } return 0; } 这个程序是一个死循环,原因在于for循环里的判断条件。 例2:#define SQR(x) x*x int main() { int a;原创 2017-12-06 01:43:06 · 430 阅读 · 0 评论 -
学习C语言的第四天
本以为学习C语言是一个极其漫长且困难的过程,,没想到在第四天就已经可以写出一个小工程了。 下面请看我写的代码:int len(char a[]) { printf(“显示字符串的长度\n”); printf(“请输入一个字符串:”); scanf(“%s”,a); int i=0; while(a[i]!=’\0’) i++;原创 2017-12-06 18:38:21 · 253 阅读 · 0 评论 -
学习C语言的第六天
在学习C语言的第五天里,我已经接触到了C语言的重点也是难点——指针,今天是我学习C语言的第六天,在今天的学习中我将会加深对指针的理解以及应用。 下面是我自己写的几个例题: 例1:int main(int argc, char **argv) { int a[3]={ 0 }; printf(“%0x %0x %0x”,a,a+1,&a+1)原创 2017-12-07 17:42:15 · 249 阅读 · 0 评论 -
C语言学习的第五天
前几天的学习使我对C语言已经有了一定的了解,在这第五天,我也接触到了C语言中的难点——指针。 例1:int main() { int *p; int a=3; p=&a; printf(“d\n”,*p); return 0;} 这个程序的结果是3。 例2:int main() { int y=0,x=3;原创 2017-12-06 19:42:09 · 261 阅读 · 0 评论 -
标准的链表以及各种相关的操作
注意加上头文件 typedef int Status; typedef struct Node { int data; struct Node *next; }Node,*LinkList; Status visit(int c) { printf(“%d “,c); return OK; } Status InitList(LinkList原创 2018-02-01 16:05:13 · 281 阅读 · 0 评论 -
基本数据类型分析
编程时需要使用字节,为了方便引入了数据类型。1.什么是数据类型?数据类型可以理解为固定内存大小的别名,也是创建变量的模子。使用内存是需要借,为了方便引入变量。什么是变量呢?一段连续实际存储空间的别名。程序中通过变量来申请并命名存储空间。通过变量的名字可以使用存储空间。实例:#include int main(){ char c = 0;原创 2017-11-16 19:17:46 · 889 阅读 · 0 评论 -
数据类型与变量的分析
编程时需要使用字节,为了方便引入了数据类型。 1.什么是数据类型? 数据类型可以理解为固定内存大小的别名,也是创建变量的模子。 使用内存是需要借,为了方便引入变量。 什么是变量呢? 一段连续实际存储空间的别名。 程序中通过变量来申请并命名存储空间。 通过变量的名字可以使用存储空间。原创 2017-11-24 10:33:26 · 239 阅读 · 0 评论