![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言学习笔记
文章平均质量分 95
jacklin_001
这个作者很懒,什么都没留下…
展开
-
数据结构5: 链表(单链表)的基本操作及C语言实现
逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。由于分散存储,为了能够体现出数据元素之间的逻辑关系,每个数据元素在存储的同时,要配备一个指针,用于指向它的直接后继元素,即每一个数据元素都指向下一个数据元素(最后一个指向NULL(空))。图1 链式存储存放数据如图1所示,当每一个数据元素都和它下一个数据元素用指针链接在一起时,就形成了一个链,这个链子的头就位于第一个数据元素,这样的存储方式原创 2020-09-01 18:58:38 · 499 阅读 · 1 评论 -
#pragma comment() 的使用
#pragma 的使用我们经常用到的是#pragma comment(lib,"*.lib")这类的。pragma comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库。和在工程设置里写上链入Ws2_32.lib的效果一样,不过这种方法写的程序别人在使用你的代码的时候就不用再设置工程settings了...原创 2020-08-20 17:35:13 · 868 阅读 · 1 评论 -
在socket编程中使用域名
客户端中直接使用 IP 地址会有很大的弊端,一旦 IP 地址变化(IP 地址会经常变动),客户端软件就会出现错误。而使用域名会方便很多,注册后的域名只要每年续费就永远属于自己的,更换 IP 地址时修改域名解析即可,不会影响软件的正常使用。关于域名注册、域名解析、host 文件、DNS服务器等本节并未详细讲解,请读者自行脑补。本节重点讲解如何使用域名。通过域名获取IP地址域名仅仅是 IP 地址的一个助记符,目的是方便记忆,通过域名并不能找到目标计算机,通信之前必须要将域名转换成 IP 地址。ge原创 2020-08-18 15:59:22 · 1856 阅读 · 0 评论 -
C线程 pthread_attr_t pthread_attr_init
1.【线程属性】线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。调用pthread_attr_init之后,pthread_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。如果要去除对pthread_attr_t结构的初始化,可以调用pthread_attr_destroy函数。如果pthread_attr_init实现时为属性对象分配了动态内存空间,pthread_attr_destroy还会用无效的值初始化属性对象,原创 2020-08-13 19:02:24 · 615 阅读 · 0 评论 -
C/C++怎么理解void *(*start_routine) (void *)
你定义了一个函数指针。名字叫 start_routine 。这个函数的返回值是void *(一个指针)参数是void *(一个指针)一般这种写法最好用typedef void* (start_routine)(void)然后用start_routine当作一种类型来使用。如:start_routine pfoo;调用的时候:*pfoo(p);(void *)的理解unsigned char err;unsigned char f;unsigned char a(unsig.原创 2020-08-13 18:26:12 · 2407 阅读 · 2 评论 -
堆栈的原理解析学习笔记
每一个使用c语言的都应该知道栈的重要性,我们能够使用C/C++语言写出诸多复杂的程序,很大功劳一部分有归于栈的实现,因为它可以帮助我们实现函数间的嵌套调用。汇编程序的运行是不需要栈的,所以注定它函数的嵌套层数不会太多,一般是父函数调用子函数,然后在子函数就返回了,很少见到子函数还会调用孙子函数的情况。这是由它的语言特性决定的。因为每当汇编语言调用子函数时,就会将返回的PC地址保存在LR中, 如果子函数还要调用孙子函数,那么执行时也会将子函数的返回地址保存在LR中,这时如果要返回父函数,就需要将返回父PC转载 2020-08-13 17:18:22 · 1262 阅读 · 0 评论 -
【C语言学习笔记】VS中"This function or variable may be unsafe."警告的解决办法
VS中”This function or variable may be unsafe.”警告的解决办法问题原因C语言的标准函数中,一些读取或写入内存的函数存在内存越界的问题,从而使得内存数据变得不安全。如scanf、gets、strcat等函数都存在着这样的问题。为了避免这个问题,在VS中,另外提供了如scanf_s,get_s,strcat_s等相关的改进函数,来替代原来的标准函数的功...转载 2019-08-06 16:41:52 · 393 阅读 · 0 评论 -
C语言scanf函数用法完全攻略
本节介绍输入函数 scanf 的用法。scanf 和 printf 一样,非常重要,而且用得非常多,所以一定要掌握。概述scanf 的功能用一句话来概括就是“通过键盘给程序中的变量赋值”。该函数的原型为:# include <stdio.h>int scanf(const char *format, ...);它有两种用法,或者说有两种格式。1) scanf("输...转载 2019-08-09 15:04:29 · 114567 阅读 · 37 评论 -
printf用法大全,C语言printf格式控制符一览表
输入输出函数(printf 和 scanf)是C语言中非常重要的两个函数,也是学习C语言必学的两个函数。在C语言程序中,几乎没有一个程序不需要这两个函数,尤其是输出函数(printf),所以这两个函数必须要掌握。如果在程序中要使用 printf 或者 scanf,那么就必须要包含头文件 stdio.h。因为这两个函数就是包含在该头文件中的。输出函数的功能是将程序运行的结果输出到屏幕上,而输入函...转载 2019-08-09 15:20:42 · 13292 阅读 · 3 评论 -
整数在内存中存储方式
我们都知道在计算机内部数据的存储和运算都采用二进制,是因为计算机是由很多晶体管组成的,而晶体管只有2种状态,恰好可以用二进制的0和1表示,并且采用二进制可以使得计算机内部的运算规则简单,稳定性高。在计算机中存在实数和整数,而整数又分为无符号整数和有符号整数,无符号的整数表示很简单,直接采用其二进制形式表示即可,而对于有符号数的表示却成了问题,如何表示正负?如何去处理正负号?下面来具体说下其中的原因...转载 2019-08-07 15:41:43 · 995 阅读 · 0 评论 -
C语言内存机制详解
参考链接:http://c.biancheng.net/view/423.htmlhttps://blog.csdn.net/greybeard/article/details/84132968https://blog.csdn.net/wws199304/article/details/44786581进程和线程首先了解一下进程和线程当启动一个程序时,操作系统创建一个进程...原创 2019-08-12 18:21:50 · 1473 阅读 · 2 评论 -
C/C++ typedef用法详解
第一、四个用途用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,// 和一个字符变量;以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针虽然:char ...原创 2019-08-16 18:19:07 · 103 阅读 · 0 评论 -
C语言笔记(二维数组与数值指针)
一、关于二维数组和二维数组区别(1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的。所以从内存的角度来分析,一维数组和二维数组其实没有本质区别。(2)二维数组可以使用一维数组来代替。但是在实际的应用中,有时候使用二维数组会更加直观,方便程序的编程。(3)两者在内存使用效率上是一模一样的。二、二维数组的第一维和第二维概念(1)例如 int a[2][5]中...转载 2019-09-04 14:56:58 · 351 阅读 · 0 评论 -
C语言宏参数的字符串化和宏参数的连接
在宏定义中,有时还会用到#和##两个符号,它们能够对宏参数进行操作。# 的用法#用来将宏参数转换为字符串,也就是在宏参数的开头和末尾添加引号。例如有如下宏定义:#define STR(s) #s那么:printf("%s", STR(c.biancheng.net));printf("%s", STR("c.biancheng.net"));分别被展开为:pri...转载 2019-08-05 18:34:55 · 741 阅读 · 0 评论 -
C语言学习中记录的小知识点
1、(char *)a的意思(char*)a的意思是:将a强制类型转换为字符指针类型。char*是C语言中,用于定义指针的变量符号。比如:char *p; 这个变量p是个指针变量;就是说,p这个变量里能存储一个char类型的变量的首地址。字符指针是指向类型为unsigned char的指针变量。例如:unsigned char ch = 'a';unsigned char *ch_p...原创 2019-03-06 19:05:22 · 154 阅读 · 0 评论 -
C语言中的*和&符号
之前对*和&符号一直理解的比较浅显。只知道:*p好像表示的是一个指针;&p表示的是一个地址。然而这次当遇到了下面这个情况的时候:int a = 10;int *b = &a;printf(“%d\n”, a);printf(“%d\n”, &a);printf(“%d\n”, b);printf(“%d\n”, *b);结果:10648762...转载 2018-12-16 12:36:14 · 580 阅读 · 0 评论 -
c语言线程Pthread讲解
POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32作用线程库实行了POSIX线程标准通常称为Pthreads。POSIX线程具有很好的可移植...转载 2018-12-16 18:36:56 · 8053 阅读 · 0 评论 -
C语言中 * “星号”的九种用法
C语言中 * “星号”的九种用法乘法运算符复合赋值运算符假读符注释符普通符号指针定义符指向运算符行列地址转换符地址值符乘法运算c=ab;a=2, b=3, c=23=6;2.复合赋值运算符i=5; i*=7;将运算符*=左边变量的值与右边操作数相乘,结果i=35;3.假读符mian(){int i, j; scanf(“%3d%*3d%3d”, &i,...转载 2018-12-16 18:58:38 · 14051 阅读 · 2 评论 -
全面详解c语言使用cJSON解析JSON字符
为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件!如果要自己写的话就是重造轮子了,况且效率上也不一定会比cJSON更好!且文件体积大小不到30k,源代码思路也非常清晰,也非常适合研究。点我下载cJSON当我们下载好cJSON只需要把.c和.h文件包含文件拷贝到我们工程目录下,并将头文件和实现文件包含进...转载 2019-02-14 19:03:20 · 2151 阅读 · 1 评论 -
memset函数使用方法
memset函数使用方法 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。需要的头文件在C中 <string.h>在C++中 <cstring> 更详细的解说见百度百科 --> http://baike.baidu.com...转载 2019-02-15 14:12:45 · 284 阅读 · 0 评论 -
CMakeLists用法总结
分一下几个方面来描述:1. 每一个LIB要编译成静态库或动态库如何描述,每一个TOOL要编译成可执行文件如何描述?2. LIB和TOOL可能会依赖于其他LIB,该如何描述?3. 每个LIB和TOOL都会include很多头文件,相同的头文件如何处理,私有的头文件如何处理?4. CMake中的一些用法5. LLVM中用到的技巧先举一个简单的例子: // └─tutorial.c └...转载 2019-01-30 19:38:29 · 2593 阅读 · 0 评论 -
C中 snprintf()函数的作用
函数原型:int snprintf(char* dest_str,size_t size,const char* format,...);所需头文件:#include<stdio.h>函数功能:先将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至dest_str中。注意事项:如果格式化后的字符串长度小于size,则将字符串全部拷贝至dest_str中...转载 2019-02-17 19:24:28 · 277 阅读 · 0 评论 -
pthread_create 创建线程,传递参数
pthread_create是UNIX环境创建线程函数头文件 #include<pthread.h>函数声明 int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);返回值 ...转载 2019-02-18 11:32:05 · 1582 阅读 · 0 评论 -
c/c++ assert作用总结
1. 简介assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。原型定义:#include <assert.h>void assert( int expression ); assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 ab...转载 2019-03-01 19:11:58 · 695 阅读 · 0 评论 -
c语言中U16和S16的意义
在C语言中,并没有U16和S16这两种基本类型。不过在C语言的编程习惯上,往往为了简写,约定U16和S16两种类型。尤其常见于嵌入式编程或驱动编程上。其中U16为16位无符号数,S16为16为有符号数。定义如下:typedef short S16;typedef unsigned short U16;可以看到,U16和S16都是占2个字节的整型类型,区别只是是否有符号。于是U16可...转载 2019-03-05 15:57:25 · 12854 阅读 · 0 评论 -
C语言 sscanf()函数的用法
sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明: sscanf与scanf类似,都是用于输入的,只是后者以屏幕(std...转载 2019-03-05 16:25:54 · 441 阅读 · 0 评论 -
assign,copy,retain -Object-C中纠结的三个属性(retain)
assign,copy,retain这三个属性在我们申明属性时,经常用到,那么到底时什么东西呢 ?有什么意义呢?那我们就来看清楚把。开始吧,不废话了,还是用代码说话。先看assign 的情况,因为只是默认的方式@property(nonatomic,retain)NSString*name;那么编译器会生成,相应的get,se...转载 2019-03-06 15:40:02 · 185 阅读 · 0 评论 -
win10搭建c语言开发环境
win10搭建c语言开发环境在window10上面用MingW搭建编写C语言的环境1、下载Mingw(下载页面自行搜索),开始安装,安装路径自行选择2、点击‘continue’,出现如下图,3、稍微等待一会,出现如下图界面:选择4项,然后点击‘installation’-->'apply changes'-->'apply',然后就请等待几分钟(网速快的话,时间会比较短)4、完成以后,...原创 2018-10-11 18:02:08 · 32853 阅读 · 4 评论