C语言
文章平均质量分 81
C语言基础知识学习
Galaxy_Robot
这个作者很懒,什么都没留下…
展开
-
C语言的##运算符-预处理器的粘合剂
C语言的##运算符-预处理器的粘合剂引言与#运算符类似,##运算符可以用于类函数宏的替换部分。而且,还可以用于宏对象的替换部分。##运算符可以把两个记号组合成一个。示例分析// glue.c -- use the ## operator#include <stdio.h>#define XNAME(n) x ## n#define PRINT_XN(n) printf("x" #n " = %d\n", x ## n);int main(void){ int XNA原创 2020-06-28 01:00:02 · 694 阅读 · 0 评论 -
C语言的#运算符
C语言的#运算符引言在类函数宏中(带参数的宏),#号作为一个预处理运算符,可以把记号转换成字符串。示例分析下面是一个类函数宏:#define PSQR(X) printf("The square of X is %d. \n",((X)*(X))假设这样使用宏:PSQR(8);输出为The square of X is 64.注意双引号字符串中X被视为普通文本,而不是一个可被替换的记号。C语言允许在字符串中包含宏参数。在类函数宏中(带参数的宏),#号作为一个预处理运算符,可以把原创 2020-06-28 00:57:42 · 808 阅读 · 0 评论 -
C语言的_Atomic类型限定符(C11)
C语言的_Atomic类型限定符(C11)并发程序设计把程序执行分成可以同时执行的多个线程。这程序设计带来了新的挑战,包括如何管理访问相同数据的不同线程。C11通过包含可选的头文件stdatomic.h和threads.h,提供了一些可选的(不是必须实现的)管理方法。值得注意的是,要通过各种红函数类访问原子类型。当一个线程对一个原子类型的对象执行原子操作时,其他线程不能访问该对象。所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位原创 2020-06-28 00:56:26 · 6940 阅读 · 0 评论 -
C语言的assert断言宏
C语言的assert断言宏assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。如果assert()终止了程序,它首先会显示失败的测试、包含测试的文原创 2020-06-28 00:54:35 · 306 阅读 · 0 评论 -
C语言的const类型限定符
C语言的const类型限定符类型限定符的变化我们通常用类型和存储类别来描述一个变量。C90还增加了两个属性:恒常性(constancy)和易变性(volatility)。这两个属性分别用关键字const和volatile来声明,以这两关键字创建的类型是限定类型。C99标准新增了第3个限定符:restrict,用于提高编译器优化。C11新增了第四个限定符:_Atomic。C11提供了一个可选库,由stdatomic.h管理,以支持并发程序设计,而且 _Atomic是可选支持项。C99为类型限定符增加了一原创 2020-06-28 00:53:24 · 376 阅读 · 0 评论 -
C语言的fclose()函数
C语言的fclose()函数头文件:#include <stdio.h>定义函数:int fclose(FILE * stream);函数说明:fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源。必要时刷新缓冲区。对于比较正式的程序,应该检查是否成功关闭文件。如果成功关闭,fclose()函数返回0,否则返回EOF:if (fclose(fp) != 0) printf("Error in closing fil原创 2020-06-28 00:49:38 · 2507 阅读 · 0 评论 -
C语言的fopen()函数
C语言的fopen()函数fopen()的声明在头文件:#include <stdio.h>fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为: FILE * fopen(const char * path, const char * mode);【参数】path为包含了路径的文件名,mode为文件打开方式(模式)。表1 fopen()的模式字符串打开方式说明“r”以读模式打开文件“w”以写模式打开,把现有文件的长度截为0,原创 2020-06-28 00:47:49 · 7500 阅读 · 4 评论 -
C语言的getc()和putc()函数
C语言的getc()和putc()函数getc()和putc()函数与getchar()和putchar()函数类似。不同的是,要告诉getc()和putc()函数使用哪一个文件。下面这条语句的意思是"从标准输入中获取一个字符":ch=putchar();然而,下面这条语句的意思是“从fp指定的文件中获取一个字符”:ch=putc(fp);类似地,下面语句的意思是"把字符ch放入FILE指针fpout指定的文件中":putc(ch,fpout);实际上,putchar()函数一般通过put原创 2020-06-28 00:46:23 · 1412 阅读 · 0 评论 -
C语言的restrict类型限定符
C语言的restrict类型限定符restrict限定符的用法restrict关键字允许编译器优化某部分代码以更好地支持计算。它只能用于指针,表明该指针是访问该对象唯一且初始的方式。要弄明白为什么这样做有用,先看几个例子。考虑下面的代码:int ar[10];int * restrict restar= (int *) malloc(10 * sizeof(int));int * par= ar;这里,指针restar是访问由malloc()所分配的内存的唯一且初始的方式。因此,可以用res原创 2020-06-28 00:45:24 · 667 阅读 · 0 评论 -
C语言的strcpy()和strncpy()函数
C语言的strcpy()和strncpy()函数strcpy()函数strcpy() 函数用来复制字符串,其原型为: char *strcpy(char *dest, const char *src);【参数】dest 为目标字符串指针,src 为源字符串指针。注意:src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置 src 所包含的字符串(包含结束符NULL)。【返回值】成功执行后返回目标数组指针 dest。strcpy() 把src所指的由NULL结原创 2020-06-28 00:43:06 · 1255 阅读 · 0 评论 -
C语言的typedef指令
C语言的typedef指令typedef工具是一个高级数据特性,利用typedef可以为某一类型自定义名称。它与#define有3个不同点:(1)与#define不同,typedef创建的符号名只受限于类型,不能用于值。(2)typedef由编译器解释,不是预处理器。(3)在其受限范围内,typedef比#define更灵活。工作原理使用typedef时要记住,typedef并没有创建任何新类型,它只是为某个已存在的类型增加一个方便使用的标签。示例:假设要用BYTE表示1字节的数组。typ原创 2020-06-28 00:40:54 · 312 阅读 · 1 评论 -
C语言的volatile类型限定符
C语言的volatile类型限定符volatile限定符的用法volatile限定符告诉计算机,代理(而不是变量的所在的程序)可以改变该变量的值。通常,它被用于硬件地址以及在其他程序或同时运行的线程中共享数据。例如,一个地址上可能存储着当前的时钟时间,无论程序做什么,地址上的值都随时间的变化而变化。或者一个地址用于接收另一台计算机传入的信息。volatile int locl; /*locl是一个易变的位置*/volatile int *ploc; /*ploc是一个指向易变的位置的指针*/以原创 2020-06-28 00:37:02 · 285 阅读 · 0 评论 -
C语言的程序跳转break,continue等
C语言的程序跳转break,continue等引言一般而言,程序进入循环后,在下一次循环测试之前会执行完循环体中的所有语句。continue和break语句可以根据循环体的测试结果忽略一部分循环体内容,甚至结束循环。下面介绍break、continue和goto语句的用法。break语句这3中语句都能从程序流的一处跳至另一处。所有的循环和switch语句都可以使用break语句。它使程序控制跳出当前循环或switch语句的剩余部分,并继续执行更在循环或switch后面的语句。示例:while原创 2020-06-28 00:35:42 · 403 阅读 · 0 评论 -
C语言的单字符IO之getchar()和putchar()
C语言的单字符IO之getchar()和putchar()引言getchar()和putchar()每次只处理一个字符。你可能认为这种方法很低级,与我们的阅读方式相差甚远。但是,这种方法很适合计算机,而且这是绝大多数文本处理程序所用的核心方法。示例分析/* echo.c -- repeats input */#include <stdio.h>int main(void){ char ch; while ((ch = getchar()) != '#')原创 2020-06-26 23:00:07 · 533 阅读 · 0 评论 -
C语言的二进制IO函数fread()和fwrite()
C语言的二进制IO函数fread()和fwrite()之前的fprintf()、fscanf()、fgets()和fputs()等标准I/O都是面向文本的,用于处理字符和字符串。例如,下面的代码:double num=1./3;fprintf(fp,"%f",num);把num存储为8个字符;0.333333。使用%0.2f转换说明将其存储为4个字符:0.33,用%0.2f转换说明将其存储为14个字符:0.33333333333。改变转换说明将改变存储该值所需的空间数量,也会导致存储不同的值。原创 2020-06-26 22:59:30 · 1192 阅读 · 0 评论 -
C语言的格式化输出转换说明、修饰符和标记详解
C语言的格式化输出转换说明、修饰符和标记详解表1 转换说明及其打印的输出结果转换说明输出%a,%A浮点数、十六进制数和p计数法(C99/C11)%c一个字符%d有符号十进制数%e,%E浮点数,e计数法%f浮点数,十进制计数法%g,%G根据数值不同自动选择%f或%e,%e格式在指数小于-4或者大于等于精度时使用%i有符号十进制整数(与%d相同)%o无符号八进制整数%p指针%s字符串%u无符号十进制数原创 2020-06-26 22:58:52 · 1481 阅读 · 0 评论 -
C语言的存储类别
C语言的存储类别关键字auto、extern、static、register、_Thread_local (C11)一般注解变量的存储类别取决于它的作用域、链接和存储器。存储类别由声明变量的位置和与之关联的关键字决定。定义在所有函数外部的便来那个具有文件作用域、外部链接、静态存储器。声明在函数中的变量是自动变量,付费该变量前面使用了其他关键字。它们具有块作用域、无链接、自动存储期。以static关键字声明在函数中的变量具有块作用域、无链接、静态存储期。以static关键字声明在函数外部的变量具有文原创 2020-06-26 22:57:23 · 715 阅读 · 0 评论 -
C语言的宏之带参数宏
C语言的宏之带参数宏引言C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数,这种宏外形和作用与函数类似,即类函数宏。但是它的行为和函数调用完全不同。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。类函数宏定义的圆括号中可以有一个或多个参数,随后这些参数出现在替换体中。示例分析下面是一个类函数宏的示例:#define SQUARE(X) X*X在程序中可以这样使用:z= SQUARE(2);这看上去像函数调用,但是它的行为和函数调用完全不同。原创 2020-06-26 22:58:19 · 1239 阅读 · 0 评论 -
C语言的宏之明示常量
C语言的宏之明示常量引言预处理功能是C语言特有的功能,它是在对源程序正式编译前由预处理程序完成的,程序员在程序中用预处理命令来调用这些功能。宏定义可以带有参数,宏调用时是以实参代换形参,而不是“值传送”。为了避免宏代换时发生错误,宏定义中的字符串应加括号,字符串中出现的形式参数两边也应加括号。文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。条件编译允许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效原创 2020-06-26 22:08:26 · 1493 阅读 · 0 评论 -
C语言的命令行参数
C语言的命令行参数在图形界面普及前都是用命令行界面。命令行(command line)是在命令行环境中,用户为运行程序输入命令的行。命令行函数(command-line argument)是同一行的附加项。如下例是unix环境下的命令行:$ fuss -r Gingerfuss就是命令行,后面的是命令行参数。例如在windows中常用的查看ip地址的命令C> ipconfig /allipconfig是命令行,后面的是参数。一个C程序可以读取并使用这些附加项。示例:/* repe原创 2020-06-26 22:00:36 · 2227 阅读 · 1 评论 -
C语言的内存分配calloc()函数
C语言的内存分配calloc()函数C语言的内存分配除了用malloc()函数,还可以用calloc()函数,典型的用法如下:long * newmem;newmem = (long *)calloc(100,sizeof(long));和malloc()类似,在ANSI之前,calloc()也返回指向char的指针;在ANSI之后,返回指向void的指针。如果要存储不同的类型,应私用强制类型转换运算符。calloc()函数接受两个无符号整数作为参数(ANSI规定是size_t类型)。 第一个参原创 2020-06-26 21:56:08 · 1125 阅读 · 0 评论 -
C语言的内存分配malloc()和free()
C语言的内存分配malloc()和free()引言静态数据在程序载入内存时分配,而且自动变量的数据在程序执行块时分配,并在程序离开该块时销毁。另外,C语言可以在程序运行时分配更多的内存。比如说,你做一个通讯录,但是你不能确定到底有多少人需要存储,因此你就不能确定具体需要多少内存空间,因此你可以使用动态内存分配来解决这个问题,即有一个数据需要存储的时候再分配内存给它,这样就需要使用到malloc()函数了。该函数接受一个参数:所需内存的字节数。malloc()和free()malloc()函数会找到原创 2020-06-26 21:46:45 · 718 阅读 · 0 评论 -
C语言数据类型
C语言数据类型按计算机的存储方式可分为两大基本类型:整数类型和浮点数类型,不同的种类提供了不同的范围和精度。关键字创建基本数据类型要用到8个关键字:int、long、short、unsigned、char、float、double、signed(ANSI C)。有符号整数int是所有系统中基本整数类型。long 或long int 可存储的整数应大于或等于int可储存的最大数;long至少是32位。short 或short int 整数应小于或等于int 储存的最大数;short至少是16位原创 2020-06-26 21:44:57 · 585 阅读 · 0 评论 -
C语言的头文件详解
C语言的头文件详解引言在C语言家族程序中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,主要用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。 .c就是你写的程序文件。头文件的作用一般在一个应用开发体系中,功能的真正逻辑实现是以硬件层为基础,在驱动程序、功能层程序以及用户的应用程序中完成的。头文件原创 2020-06-26 21:43:06 · 6878 阅读 · 0 评论 -
C语言的文件IO函数
C语言的文件IO函数引言C语言文件I/O函数主要指fprintf()、fscanf()、fgets()和fputs()。它们既可以实现向gets()、puts()、getc()和putc()函数样从键盘和屏幕进行输入输出,也可以对文件进行输入输出。fprintf()和fscanf()函数头文件:#include <stdio.h>定义函数:int fprintf(FILE * stream, const char * format, ...);函数说明:fprintf()会根据参数原创 2020-06-26 21:40:45 · 501 阅读 · 0 评论 -
C语言的文件随机访问fseek()和ftell()函数
C语言的文件随机访问fseek()和ftell()函数我们要讨论3个问题:fseek()和ftell()函数的工作原理、如何使用二进制流、如何让程序可移植。fseek()与ftell()的工作原理头文件:#include <stdio.h>定义函数:int fseek(FILE * stream, long offset, int whence);**函数说明:fseek()用来移动文件流的读写位置. **1.参数stream 为已打开的文件指针。2.参数offset 是偏移量,原创 2020-06-26 21:38:11 · 1061 阅读 · 0 评论 -
C语言的预处理和条件编译指令
C语言的预处理和条件编译指令预处理简介C语言由源代码生成的各阶段如下:C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件其中 编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程先于编译器对源代码进行处理。 在C 语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编原创 2020-06-26 21:35:11 · 798 阅读 · 0 评论 -
C语言的指针兼容性讨论
C语言的指针兼容性讨论这里首先给大家科普一个小知识,如上图,我们平时吃的米饭通常是精白米,其实就是稻谷的胚乳,营养价值只占稻谷的5%。而糙米和留胚米的营养价值占稻谷的85%。因此我们吃的精米饭其实营养价值很少,不妨可以去某东或某猫买点糙米或胚芽米,尝尝高营养价值的糙米或胚芽米!引言昨天有一位网友在我的博客《C语言的const类型限定符》留言了一个问题,涉及到const限定符合指针兼容性的问题,一开始我也一头雾水,摸不着头脑,后来经过查阅资料弄清楚了,主要是指针兼容性问题。这里就总结一下指针兼容性的原创 2020-06-26 21:32:07 · 759 阅读 · 0 评论 -
C语言的字符串处理函数strlen()
C语言的字符串处理函数strlen()C库提供了多个字符串处理函数,ANSI C把这些函数的原型放在string.h头文件中。其中最常用的有strlen()、strcat()、strcmp()、strncmp()、strcpy()和strncpy()。另外还有sprintf(),其原型在stdio.h头文件中。这些函数都在后面的博客进行详细分析。strlen()函数strlen()函数用于统计字符串的长度,它会统计字符包括空格和标点符号,不统计空字符\0。注意与sizeof运算符区分,sizeof以原创 2020-06-26 21:28:21 · 2992 阅读 · 0 评论 -
C语言的字符串函数strcat()和strncat()
C语言的字符串函数strcat()和strncat()strcat() 函数简介strcat() 函数用来连接字符串,其原型为: char *strcat(char *dest, const char *src);【参数】dest 为目的字符串指针,src 为源字符串指针。strcat() 会将参数 src 指向的字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。把拼接后形成的字符串作为第一个字符串原创 2020-06-26 21:26:53 · 1501 阅读 · 0 评论 -
C语言的字符串函数strcmp()和strncmp()
C语言的字符串函数strcmp()和strcnmp()strcmp()函数简介strcmp() 用来比较字符串(区分大小写),其原型为: int strcmp(const char *s1, const char *s2);【参数】s1, s2 为需要比较的两个字符串。字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。但是并不是所有系统都返回原创 2020-06-26 21:24:40 · 3098 阅读 · 0 评论 -
C语言的字符串输出fputs()函数
C语言的字符串输出fputs()函数fputs()函数是puts()函数针对文件定制的版本,它们的区别如下:fputs()函数的第2个参数指明要写入数据的文件。如果要打印在显示器上,可以用定义在stdio.h中的stdout(标准输出)作为参数。与puts()不同,fputs()不会再输出的末尾添加换行符。注意,gets()丢弃输入中的换行符,但是puts()在输出中添加换行符。另一方面,fgets()保留输入中的换行符,fputs()不在输出中添加换行符,因此,puts()应与gets()配原创 2020-06-26 21:23:12 · 944 阅读 · 0 评论 -
C语言的字符串输入fgets()函数
C语言的字符串输入fgets()函数fgets()函数简介读字符串函数fgets()的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针),要从键盘输入时文件指针的参数为:stdin ; 其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'/0'。示例分析fgets()函数通过2个参数限制读入的字符数来解决溢出的问题。该函数专门设计用于处理文件输入,所以一般情况下可能不太好用。fgets()和原创 2020-06-26 21:18:51 · 6630 阅读 · 2 评论 -
C语言的字符串输入gets()函数
C语言的字符串输入gets()函数字符串简介字符串(character string)是一个或多个字符的序列。如下所示:"Zing went the strings of my heart!"双引号不是字符串的一部分。双引号告知编译器它括起来的是字符串。C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。字符串常量"x"和字符常量'x'不同,区别之一在于'x'是基本类型(char),而"x"是派生类型(char数组);区别之二是"x"实际上由两个字符串组成:'x'和空字原创 2020-06-26 21:13:23 · 8897 阅读 · 0 评论 -
C语言的字符串输入函数gets_s()
C语言的字符串输入函数gets_s()C11新增了gets_s()函数(可选),和fgets()函数类似(上一篇博客有介绍《 C语言的字符串输入fgets()函数 》),用一个参数限制读入的字符数。gets_s()函数的形式如下:gets_s(words,STLEN);gets_s()与fgets()的区别如下:gets_s()只从标准输入(通常是键盘)中读取数据,所以不需要第3个参数。如果gets_s()读到换行符,会丢弃它而不是存储它。如果gets_s()读到最大字符数都没有读到换行符原创 2020-06-26 21:11:33 · 23945 阅读 · 2 评论