
C语言笔记
一看就懂的C语言,萌新起步。
Sandm *
C , C++知识分享
展开
-
C语言中常见的优先级
1. 优先级:!= “大于” 算术运算符 “大于” 逻辑运算符2. 图像:原创 2022-05-27 09:32:29 · 364 阅读 · 0 评论 -
C语言中字符串大小与长度的区分
字符串大小和字符串长度不同:字符串大小指该字符串占用多少空间字符串长度指该字符串的字符个数原创 2021-11-29 21:48:04 · 2111 阅读 · 1 评论 -
C语言中块作用域的静态变量与外部链接的静态变量
静态的意思不意味着它的值不变,而是该变量在内存中原地不动,即所属内存不会被系统清除具有文件作用域的变量**自动具有(也必须是)静态存储期 **可以创建具有静态存储期,块作用域的局部变量(在变量前加关键字static),这些特殊的局部变量与自动变量一样具有相同的作用域,但是程序离开它们所在的函数后,这些变量不会消失最重要的一点,计算机在多次函数调用之间会记录变量的值,即静态变量会保存使其变量改变后的值。这是因为静态变量和外部变量在程序被载入内存时已执行完毕不能在函数的形参中使用st..原创 2021-11-29 20:25:24 · 575 阅读 · 0 评论 -
C语言中的分配内存
在确定用哪种存储类别后,根据已制定好的内存管理规则,将自动选择其作用域和存储期原创 2021-11-29 20:31:32 · 84 阅读 · 0 评论 -
C语言随心记—文件
重定向把其它文件视为标准输入或标准输出如果使用重定向把输出发送给文件而不是屏幕,那么发送至标准错误输出的内容就会被发送到屏幕上原创 2021-11-29 21:34:40 · 385 阅读 · 0 评论 -
C语言中的自动变量
变量具有自动存储期意味着,程序在进入该变量声明所在的块时变量存在,程序在退出该块时变量消失,原来该变量占用的内存位置现在可以做其它的用途。自动变量不会初始化,除非显式初始化它...原创 2021-11-29 19:50:24 · 642 阅读 · 0 评论 -
C语言中的块
块是用一对花括号括起来的代码区域,包括其中的内容,例如整个函数体是一个块,函数中的任意复合语句也是一个块,定义在块中的变量具有块作用域没有花括号的块作为**循环或if语句的一部分,即使不用花括号,也是一个块,**即整个循环是它所在块的子块,循环体是整个循环块的子块...原创 2021-11-29 19:46:15 · 2124 阅读 · 0 评论 -
C语言中的存储期
存储期描述了通过这些标识符访问的**对象的生存期. **C对象有4种存储期:静态存储期,动态分配存储期,自动存储期,线程存储期如果对象具有静态存储期,那么它在程序的执行期间一直存在。文件作用域变量具有静态存储期,对于文件作用域变量,关键字static表明了其链接属性,而非存储期(以static声明的文件作用域变量具有内部链接,但是无论是内部链接还是外部链接,所有的文件作用域变量都具有静态存储期)块作用域的变量通常都具有自动存储期。即当程序进入定义这些变量的块时,为这些变量分配内存..原创 2021-11-28 15:30:17 · 478 阅读 · 0 评论 -
C语言中的链接
首先要知道什么是翻译单元:即你认为的多个文件在编译器中可能以一个文件出现,而这个包含多个文件的单独文件被称为翻译单元。例如,通常在源代码中包含一个或多个头文件。头文件会依次包含其它的头文件,但是C预处理实际上是用包含的头文件内容去替换#include指令。所以,编译器源代码文件和所有的头文件都看成是一个包含信息的单独文件。这个文件被称为翻译单元。描述一个具有文件作用域的变量时,它的实际可见范围是整个翻译单元,即这个变量不止在一个文件中可以被使用C变量有3种链接属性:外部链接,内部链接或无链..原创 2021-11-28 14:51:28 · 1567 阅读 · 0 评论 -
C语言中的作用域
作用域描述程序中可以**访问标识符的区域 **,一旦离开其作用域,程序便不能再访问该标识符一个C语言中的变量的作用域可以是块作用域,函数作用域,函数原型作用域或文件作用域块是用一对花括号括起来的代码区域,包括其中的内容块作用域变量的可见范围是从定义处到包含该定义的块的末尾虽然函数的形式参数声明在函数的左花括号之前,但是它们也具有块作用域,是属于函数体这个块,函数的形式参数也具有块作用域函数原型作用域的范围是从形参定义处到原型声明结束,这意味着编译器在处理函数原型中的形参时只..原创 2021-11-28 14:26:58 · 2758 阅读 · 0 评论 -
存储期,作用域和链接
可以用存储期描述对象,所谓存储器是指对象在内存中保留了多长时间标识符用于访问对象,而可以用作用域和链接描述标识符,标识符的作用域和链接表明了程序的哪些部分可以使用它不同的存储类别具有不同的存储期,作用域和链接明确标识符与对象之间的区别和联系,即标识符用于访问对象...原创 2021-11-28 14:00:23 · 396 阅读 · 0 评论 -
C语言中的标识符
标识符是一个名称,是用户编程时使用的名字,用于给变量,函数,常量,语句块等命名,以建立起名称与使用之间的关系标识符遵循变量的命名规则原创 2021-11-28 12:55:27 · 310 阅读 · 0 评论 -
C语言中的对象
从硬件方面看,被存储的每个值都占用一定的物理内存,C语言把这样的一块内存称为对象对象可以储存一个或多个值,一个对象可能并未储存实际的值,但是它在储存适当的值时一定具有相应的大小访问对象可以通过声明变量来完成...原创 2021-11-28 11:39:35 · 3069 阅读 · 0 评论 -
C语言随心记
输入和输出函数简称I/O函数,如getchar(),putchar(),scanf(),printf()原创 2021-11-25 08:45:39 · 380 阅读 · 0 评论 -
按位逻辑运算符
之所以叫作按位运算,是因为这些操作都是针对每一个位进行,不影响它左右俩边的位按位逻辑运算符实质是通过逐位比较俩个运算对象,生成一个新值不要把按位逻辑运算符与常规的逻辑运算符(&&,| | 和 !)混淆,常规的逻辑运算符操作的是整个数值按位取反(~),即1变0,0变1。从而创建了一个可以使用或赋值的新值按位与(&),可以理解为数学中的“且”,从真/假方面看,只有当俩个位都为真时,结果才为真。一真一假则为假。而在二进制中,1代表真,0代表假按位或(|),..原创 2021-11-24 21:34:12 · 420 阅读 · 0 评论 -
C语言随心记
移位运算符(<<和>>)可以改变变量的值原创 2021-11-24 21:03:34 · 405 阅读 · 0 评论 -
sprintf()函数
sprintf()函数的声明在stdio.h头文件中,而不是在string.h中,因为该函数和printf()函数类似(从俩个函数的名称也能看出)该函数的作用是把数据写入到字符串中,而不是打印在显示器上,因此该函数可以把多个元素组合成一个字符串sprintf()函数的第一个参数是目标字符串的地址,其余参数和printf()的参数相同,即格式字符串和待写入项的列表...原创 2021-11-24 17:42:52 · 5158 阅读 · 1 评论 -
strncpy()函数
strcpy()函数和strcat()函数都不能检查目标空间是否能容纳源字符串的副本strncpy()函数是strcpy()的升级版strncpy()函数与strcpy()函数的返回值相同,均为指针(地址)strncpy()函数有三个参数,前俩个参数与strcpy()的俩个参数相同,而它的第三个参数是用来指明可拷贝的最大字符数eg:...原创 2021-11-24 17:28:46 · 298 阅读 · 0 评论 -
strcpy()函数
该函数的作用对象是字符串它的作用是拷贝整个字符串到一个数组中该函数有俩个参数,均为字符串指针,第二个参数指向的字符串被拷贝至第一个参数指向的数组中,即第一个是目标字符串,第二个是源字符串。可以把第二个指针(参数)声明为指针,数组名或字符常量而指向源字符串的第一个指针应指向一个数据对象(如:数组,并且要保证可以容纳拷贝过来的字符串)要注意,strcpy()函数中的第一个参数(地址)的声明不能是指针声明,必须是数组声明,因为由5. 可知,第一个参数指向一个数据对象,而声明数组..原创 2021-11-24 17:18:47 · 1751 阅读 · 1 评论 -
strncmp()函数
strncmp()函数是strcmp()函数的升级版因为strcmp()函数比较字符串中的字符,直到发现不同的字符为止,但是这一过程可能会持续到字符串的末尾strncmp()函数有三个参数,它的第三个参数是限定的字符数,它的第二个参数是限定的字符,它的第一个参数是字符串而strncmp()函数不光可以在比较俩个字符串时,比较到字符不同的地方,还可以只比较第三个参数指定的字符数例如:要查找以“astro”开头的字符串,可以限定函数只查找这5个字符有了第三个参数,strncm..原创 2021-11-23 22:05:30 · 689 阅读 · 0 评论 -
strcmp()函数
有时我们经常会比较俩个字符串之间的内容,而字符串的定义是通过数组定义或指针定义,但无论是哪种,在比较字符串内容时,都会用到指针,即:对于数组定义:由以上代码可知,因为arr和brr都是指针,所以arr!=brr检查的不是俩个字符串的内容是否相等,而检查的是俩个字符串的地址是否相同,因为arr和brr储存在不同的位置,所以这俩个地址不可能相同,所以无论输入什么,即使输入的字符串内容相同,它也会出现错误。对于指针定义则没有这种问题,即:—————————————— —分割线—————————.原创 2021-11-23 21:54:19 · 1428 阅读 · 0 评论 -
strcmp()函数中的ASCII知识点
ASCII标准规定,在字母表中第一个字符串(参数)位于第二个字符串前面,strcmp()中就返回负数,如果俩个字符串相同,strcmp()返回值为0,如果第一个字符串在第二个字符串后面,则strcmp()返回一个正数。返回的值是倆者的ASCII码之差在ASCII中,大写字母在小写字母前面空字符在ASCII中排第一...原创 2021-11-23 21:28:35 · 385 阅读 · 0 评论 -
strncat()函数
它是strcat()函数的升级版因为strcat()函数在拼接字符串时无法检查第一个数组是否能容纳第二个字符串,而如果分配给第一个数组的空间不够大,多出来的字符溢出到相邻存储单元时就会出问题strncat()函数通过第三个参数指定了最大添加字符数,即程序在运行到最大字符数时停止。...原创 2021-11-23 21:11:44 · 1045 阅读 · 0 评论 -
strcat()函数
它的作用对象是字符串它的作用是拼接字符串该函数有俩个参数,均为指针在执行该函数时,该函数把第二个字符串的备份附加在第一个字符串的末尾(即拼接字符串),并把拼接后形成的新字符串作为第一个字符串,而第二个字符串不变,而且它的返回值是第一个参数...原创 2021-11-23 21:04:04 · 131 阅读 · 0 评论 -
C语言中的string.h头文件
C库提供了多个处理字符串的函数,ANSI C把这些函数的原型放在string.h头文件中。string.h头文件中常用的函数有strlen(),strcat(),strcmp(),strncmp,strcpy(),strncpy()等。原创 2021-11-22 21:56:26 · 3333 阅读 · 0 评论 -
scanf()函数
在读取字符串时,scanf()和转换说明%s只能读取一个单词单词不等于字符串,单词中不能有空格,而字符串中可以有空格scanf()更像是“获取单词”函数,而不是“获取字符串”函数,除非字符串中没有空格...原创 2021-11-22 21:51:14 · 474 阅读 · 0 评论 -
gets_s()函数
它防止缓冲区溢出的方式与fgets()类似,即用一个参数限制读入的字符数gets_s()函数只从键盘得到输入,所以gets_s函数的内部代码中就有了stdin,不像fgets()函数有多种输入方式,故它没有第三个参数。gets_s()函数读到换行符同gets()函数一样,将换行符丢掉而不是储存它如果gets_s()函数读到最大字符数都没有读到字符串的结束标志换行符,这时它会首先把目标数组中的首字符设置为空字符,会读取在达到最大字符数量后的输入,而且也要丢弃这随后的输入直到读到换行符或文..原创 2021-11-22 21:40:03 · 5510 阅读 · 0 评论 -
fgets()函数
fgets()函数有三个参数,它是gets()函数的升级版,解决了缓冲区溢出的问题它的第一个参数是字符串的地址第二个参数指明了读入字符的最大数量,即最多可读入(n-1)个字符第三个参数指明要读入的文件,C语言在这里规定,如果读入从键盘输入 的数据,则以stdin作为参数(三个参数之间要加逗号,不是分号)关于换行符,fgets()函数与gets()函数不同,它会把换行符储存在字符串中fgets()函数通常与fputs()函数配对使用..原创 2021-11-22 21:24:09 · 1834 阅读 · 0 评论 -
gets()函数
gets()函数只有一个参数(字符串的地址)所以它无法检查数组能不能装的下输入行(输入的字符串),如果输入的字符串太长,会导致缓冲区溢出 ,所以就可能使程序出现问题。gets()函数经常与puts()函数配对使用gets()函数在执行的过程中丢掉换行符,而且会在字符串的末尾添加一个空字符puts()函数是用来显示字符串,并在末尾添加换行符gets()函数与gets_s()是俩个不同的函数...原创 2021-11-22 21:08:33 · 428 阅读 · 0 评论 -
C语言随心记
如果要在字符串内部使用双引号,则必须在在俩个双引号前面加上一个\用双引号括起来的内容称为字符串常量,它属于静态存储类别,即字符串字面量被视为const数据用双引号括起来的内容被视为执向该字符串储存位置的指针,这类似于把数组名作为指向该数组位置的指针。在指定字符串数组的大小时,要确保数组的元素个数至少比字符串长度多1,因为要容纳空字符。...原创 2021-11-21 19:05:40 · 200 阅读 · 0 评论 -
C语言中定义字符串的几种方法
首先要知道字符串是以空字符(\0)结尾的char类型数组可以用字符串常量,即#define可以用char类型数组指向char的指针原创 2021-11-21 18:56:12 · 2727 阅读 · 0 评论 -
strlen函数
首先要知道它的作用对象是字符串即strlen()函数用于统计字符串的宽度,而且strlen()的参数是指针原创 2021-11-19 21:02:56 · 498 阅读 · 0 评论 -
字符串要分配空间
对于字符串的输入时,一般要写使用数组对其分配空间后,再使用输入函数去输入。原创 2021-11-18 21:12:37 · 218 阅读 · 0 评论 -
C语言随心记
如果 arr 是二维数组,arr [i] 就是一维数组,可将其视为二维数组的一行。原创 2021-11-18 18:03:15 · 446 阅读 · 0 评论 -
二维数组名的指向对象
以二维数组 int arr[4][2]={1,2,3,4,5,6,7,8};为例arr即是数组名,也是指针(首元素的地址),它是一个内含2个int类型值的数组的地址,即指向一个8字节的数据对象。可以认为arr即是本身二维数组的数组名,也是这个二维数组中包含的一个一维数组的数组名,其中这个一维数组就是每一行的数据,即int arr[4][2]={ { 1,2},{3,4},{5,6},{7,8} } 所以因为第一行包括2个int类型值,而且它又是其中这个一维数组的数组名(第一行又是这个一维原创 2021-11-18 17:30:02 · 338 阅读 · 0 评论 -
指针和多维数组
以 int Zippo [4][2];为例基知:处理多维数组的函数要用到指针二维数组的元素(或地址)是依次紧挨着排列二维数组的首元素与一维数组的首元素不同数组名是数组首元素的地址数组的地址即数组首元素的地址,即一般说什么什么的地址均指首元素的地址,因为它们在系统内部是依次紧挨着存储,知道了第一个元素的地址,便可依次找到剩余其它元素的地址Zippo[0]它本身既是一个内含俩个整数的数组,也是它这个内含数组的首元素地址内容7. 在上面的二维数组中,因为数组名等于数组首元素的地址,而又由二原创 2021-11-17 20:16:40 · 81 阅读 · 0 评论 -
数组表示法与指针表示法
首先明确数组和指针的关系十分密切,可以使用指针标识数组的元素和获得元素的值从本质上看,同一个对象有俩种表示法(以数组 int arr[6]为例)地址的表示有俩种方法:arr+2==&arr[2]数组的值的表示有俩种方法:*(arr+2)==arr[2]其实质为定义arr[n]的意思是*(arr+n),可以认为*(arr+n)的意思是 “到内存的arr位置(首元素的地址),然后移动n个单元,检索存储在那里的值”运算符*的优先级高于+所以不要混淆 *(arr+2) ..原创 2021-11-17 16:12:15 · 1163 阅读 · 1 评论 -
C语言随心记
指针加1,指针的值递增它所指向类型的大小(以字节为单位)原创 2021-11-17 15:56:07 · 577 阅读 · 0 评论 -
数组中元素与字节的关系
元素≠≠字节以 int arr[4]={1,2,3,4};为例一个元素代表的是初始化的每个数值而一个字节则是该元素中的4个字节(因为数组是int类型)中的存储单位。如果数组是double类型,则每个元素对应8个字节每一个字节对应一个地址,而不是一个元素对应一个地址,不要混淆...原创 2021-11-17 15:53:39 · 3407 阅读 · 0 评论 -
在数组中的指针+1
在C语言中指针加1指的是增加一个存储单元。**(这是为什么必须声明指针所指向对象类型的原因之一)**对于数组而言,这意味着加1后的地址是下一个元素的地址,而不是下一个字节的地址。eg:从上面的例子可以看出,当指针所指向对象类型不同时,它的加1在数组中表现出越过了多少个字节。eg:int arr[6]={1,2,3,4,5,6}short *prpr=arr*(pr+1)意思是从数组的第一个元素中的第一个字节起,向后越过俩个字节,因为指针pr的类型是short,且数组中每个元素的类型是in原创 2021-11-17 15:44:32 · 2256 阅读 · 0 评论