文顶顶博客C语言_第1页
文顶顶博客C语言_第2页
文顶顶博客C语言_第3页
文顶顶博客C语言_第4页
文顶顶博客C语言_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文顶顶博客一、数据图片文字等都是数据,在计算机中以0和I存储。(一)分类数据分为静态数据和动态数据。.静态数据:一些永久性的的数据,一般存储在硬盘中,只要硬盘没坏数据都是存在的。一般以文件的形式存储在硬盘上,电脑关机重启后依然存在。.动态数据:程序运行过程中,动态产生的的临时数据,一般存储在内存中,内存的存储空间一般较小,计算机关闭后这些数据就会被清除。软件或者电脑关闭则这些临时数据会被清除。.静态数据和动态数据可以转换。.注意:为什么不把动态数据存放到硬盘?因为直接访问内存的速度更快。软件安装在硬盘,运行在内存。程序员应该更加关心内存数据。(二)数据大小.所有的数据都是由0和1组成的。.数据都有大小,静态数据占硬盘空间,动态数据占内存空间。

.数据越大,包含的。和1就越多,.存储数据的单位是比特位和字节。一个I或者0就是一个比特位,即lbito.计算机中,以字节为单位存储数据。1字节=8比特位(lByte=8bit)o⑥.1TB=1024GB,1GB=1024MB,1MB=1024KB,1KB=1024Bo(三)C语言中的数据类型基本数据类型1)整型(int%d)2)字符型(char%c)3)浮点型%d.单精度浮点型(float).双精度浮点型(double).指针类型void*.空类型void.构造类型1)数组a[]2)结构体struct3)枚举3)枚举enum4]共用体union注意:C语言中没有布尔类型,表示开始和暂停一般使用0和1表不。二、常量(一)定义常量表示固定的数据。(二)分类.整型常量如6,27,-299.浮点型常量如543,23,5.67f.字符常量如‘6','a','F'(不能是中文如‘男').字符串常量如“6”,“男”,"nanabc”三、变量(一)定义如果一个数据的值时不确定的,或者经常需要改变,则用变量来表示O(二)定义变量目的:变量使用前必须先进行定义。在内存中分配一块存储空间给变量,以便以后存储数据。如果定义了多个变量则为多个变量分别分配不同的存储空间。格式:变量类型+变量名;举例:inta;charc;注意:变量名属于标识符,需要符合标识符的命名规范。问题:为什么定义的变量有很多的类型?答:不同类型的变量占用不同大小的存储空间,因为内存极其有限,分配适当的存储空间可以以最少的空间来存储它们,以节省空间。记住:只要是不确定的数据就应该定义变量来进行保存。在64位编译器下,int类型占4个字节,共4X8=32bit,char类型占1个字节。(三)变量的使用初始化:有两种形式。a;a=10;2.inta=10;修改:可以修改变量的值,多次赋值以覆盖。输出:使用占位符输出变量。各种类型的占位符如下:Int%d或者%iFloat/double%f(默认情况下输出6位,可以使用.2f来控制)Long%ldLonglong%lldChar%c字符串%sUnsignedlong%zd(四)变量使用注意变量的作用域:从变量定义的哪一行开始,直到代码块结束。Return;退出函数,清除内存中的数据。建议:使用矩形方框和excel来分析内存。代码块{}的作用:可以用来提高性能,即时回收不再使用的变量。(五)练习练习:使用两种方法来交换两个变量的值。第一种:复制代码#include<stdio.h>〃交换两个变量的值intmainQinta=10;intb=4;printf("a=%d,b=%d\n",a,b];〃定义一个中间变量来完成两个变量之间的交换inttemp;temp=a;a=b;b=temp;printf("a=%d,b=%d\n"la,b);return0;}复制代码第二种:复制代码#include<stdio.h>intmainQ5{inta=10;intb=4;printf("a=%d,b=%d\n",a,b];a=b-a;b=b-a;17a=a+b;1819printf("a=%d,b=%d\n",a,b);2021return0;2223)C语言的scanf函数一、变量的内存分析(一)字节与地址①.内存以字节为单位每个字节都有自己的内存地址,根据地址就可以找到该字节。整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间就相当于是每个字节,地址就是房号,根据房号可以找到房间(根据地址也可以找到内存中的字节)。相邻房间的房号是连续的,相邻字节的地址也是连续的。计算机中通常以十六进制表示地址。②.不同类型占用的字节是不一样的,数据越大则占用的字节数越多。如在64位编译器下,int类型占据4个字节,char类型占据1个字节。(二)变量的存储重点:内存寻址由大到小,优先分配内存地址较大的字节给变量,所以一般而言越先定义的变量,其内存地址越大。假设:inta=l;intb=2;下面是对其进行的模拟内存分析。&是取址运算符,用来获取地址。%p这个占位符用来输出地址。未经初始化的变量,它的值是不确定的,而C语言是弱类型的语言,如果不对一个变量进行初始化并不会报错,所以提醒变量在使用之前一定要进行初始化。二、Scanf函数(-)基本介绍Scanf是系统自带的函数,声明包含在stdio.h文件中,因此要是有该函数,必须加载#也(:111(10<51由0.11>头文件。当执行到scanf函数时,程序就暂停等待用户输入,该函数只接受变量的地址,格式为&变量名。是一个阻塞式的函数,2用户输入完毕后,则将值赋值给变量,至此函数调用完毕。敲回车键告知计算机键入完毕。(二)使用注意①.使用scanf函数输入一个字符变量。Chara;scanf(“%c”,&a);同时输入多个值。Scanf("%d,%d",&numl,num2);③.Scanf("%d\n",&a);〃在内部不能使用\n转义字符,否则没完没了。注意:在这里两个占位符之间是,隔开,则要求在输入时也使用逗号隔开如输入1,2o此时为numl=l,num2=2o若内部为"%d#%d”则输入1#2。若内部为“%dy%d",则输入ly2o如果中间的字符是空格,则在输入时可以用空格隔开,也可以敲tab键或者是回车键作为分隔符隔开,后两者可以看做是由空格组成的。C语言运算符一、算术运算C语言一共有34种运算符,包括常见的加减乘除运算。.加法:+还可以表示正号.减法:-还可以表不负号.乘法:*非数学意义上的X.除法:/注意1/2的值为0而非0.5.取余(模运算):两个整数相除之后的余数(注意两边都必须是整数,带符号只和左值有关)汪思点:①.Inta=10.8;〃数据精度丢失警告。结果为10——自动类型转换Inta=(int)10.8;〃无警告。把10.8强制转换为整型——强制类型转换③.Doublec=10.6+6〃结果为16.600000。在计算机中,拿两个数值进行运算,则运算符两边的数值需要类型相同,如果不同则进行自动类型提升。即把6转为6.000000后再参与运算。④.参与运算的两个数是什么类型,那么其结果就是什么类型。inta=10/3结果为3,doubleb=10/3结果为3.000000;doublec=10.0/3结果为3.333333。要求精确值可以进行强制类型转换。doubled=(double)3/2把3转换为double类型变为3.000000,之后2进行自动类型提升转变为2.000000参与运算,结果为1.500000。也可以写成3/(double)2。这种情况需要注意与对整体进行强制转换的区别doublee=(double)(3/2)是先计算3/2的值为1再对1进行强制类型转换,结果为l.OOOOOOo二、赋值运算(一)简单赋值Inta=10+5;a=b=10;〃从右向左,左边不能为常量(二)复合赋值a=a+5;=>a+=5;a=a*5;=>a*=5;a+=5*6+4;=>a=a+(5*6+4)提示:预算顺序取决于两点:一是运算符的优先级,二是结合的顺序。三、自增自减运算Inta=10;把a的值加1有四种方法:.a=a+l;.a+=l;.a++;.++a;简单区分a++和++a。Intb;Inta=10;b=++a;//a==ll,b==ll;a先把值加1为11,再赋值给bb=a++;//a==ll,b==10;a先把值10复制给b,a自己再加1为11b=(a++)+(++a);//al==10,a2==12,b==22b=(++a)+(a++);//al==ll,a2==ll,b==22注意:intd=10++;〃这种写法是错误的,因为对常量进行自加和自减没有任何意义。四、Sizeof作用:用来计算变量,常量或者是一种数据类型所占的内存字节数。基本形式:sizeof(变量名|常量|数据类型),完成之后返回一个值。.Sizeof变量|常量.Sizeof(变量|常量).Sizeof(数据类型)注意:数据类型一定要用括号括起来,不能写成sizeof数据类型这样的形式。五、关系运算符(一)条件判断默认情况下。在程序中写出的每一句正确的代码都会被执行,但很多时候我们需要在某个条件成立的情形下才执行某一段代码,如登录操作,这种情况可以使用条件语句来完成。(二)真假在C语言中,条件成立称为“真”,条件不成立称为“假C语言规定,任何数值都有真假性,任何非零值都为真,只有0才为假,无布尔类型。(三)关系比较关系运算的结果只有两种情况,如果条件成立就为真,值为1,如果条件不成立就为假,值为0。有6种运算符,分别是:⑴<(2)<=(3)>(4)>=[5)==(6)!=(四)使用注意①.==和仁优先级相等,其他四个关系运算符的优先级相等,且前者的优先级低于后者。如2==3>1应该先计算3>1②.关系运算符中,若优先级相同,则“从左往右”结合。如4>3<2,先计算4>3.关系运算符中的优先级小于算术运算符。如3+4>8-2相当于(3+4)>(8-2).练习5!=4+2*7>3==10先计算5!=18>3==10,5!=1==10,1==10,假六、逻辑运算符逻辑运算的结果只有两个:真(0)和假(1).与&&条件1&&条件2只有的那个条件1和条件2都成立时,才为真否则为假。.或|| 条件1||条件2当条件1或条件2中有一个成立时就为真,都不成立时为假。.非!!条件取反注意:逻辑运算符在进行运算时,只要能够确定整体的真假性,后面的条件就不再进行而是直接忽略。Inta=b=10;Intc=(a>5)&&(++b>=ll);〃此时a==10,b==ll,c==lIntc=(a<5)&&(++b>=ll);//此时a==10,b==10,c==0提示:在进行逻辑运算时,如果搞不清楚各个符号的优先级,可以使用()0七、三目运算符双目:需要两个值参与运算单目:1个数值参与运算如!5三目:需要3个数值参与格式:条件?数值1:数值2先判断?前的条件,若条件成立则返回数值1,若条件不成立则返回条件2。要求比较a和b的值,把数值大的存入到c中c=a>b?a:b比较a,b,c三个数的值,把最大的值存入到d中Intabmax=(a>b)?a:b;d=abmax>c:abmax:c;C语言流程控制一、流程控制结构(1)顺序结构:按书写顺序执行每一条语句。(2)选择结构:对给定的条件进行判断,根据判断结果决定执行哪一段代码。(3)循环结构:在给定条件成立的情况下,反复执行某一段代码。二、选择结构-if(一)if简单使用1)第一种结构:a)如果条件为真,就执行后面的语句,否则不执行。if(条件)(语句1;语句2;••••)2)第二种结构:a)如果条件成立就执行语句1,否则执行语句2。if(条件)(语句1;)else3]第三种结构:a)先判断条件1,若成立则执行语句1,其它不执行;若条件1不成立,则检查条件2・・・,【注意】如果条件3成立,则说明前面的都不成立。所有的语句块只有一个会被执行。if(条件1)(语句1;)elseif(条件2)(语句2;)else(条件3)(4)笫四种结构:a)在这种情况下,当条件成立,只执行语句1,语句2不属于次条件结构,但不推荐此种写法。If(条件)语句1;语句2;(二)if使用注意①.比较大小时,可以把常量值放在左边,变量值放在右边以避免错误。因为if(a==O)也容易被写成if(a=O),而这种情况,编译器并不会报错,推荐使用if(O==a)这种写法。.注意赋值运算符,不要把=写成是.If(条件)后面不要加分号,这代表是一个空语句,后面的代码块将成为一个独立的代码块。如if(条件);{.....}〃需要多加注意.注意作用域的问题,如果要在if后面定义新的变量,则一定要使用大括号。Inta;//a的作用域在代码块结束后失效Printf("a=%d",a);〃编译器报错,找不到标识符if(10>6)Inta;〃这种情况下报错,a的作用域不明确Printf("a=%d",a);〃编译器报错,找不到标识符.随便挑一个数值也可以做条件(三中结构练习问题:输入一个整数seore代表分数,根据分数输出等级(A-E)oA90-100B80-89C70-79D60-69E0-60代码:复制代码#include<stdio.h>intmainQ5{67〃定义变量存储分数值intscore;11〃提示输入1213printff请输入分值:\n"J;1415〃接受输入1617scanf("%d",&score);1819〃判断等级2021if(score>=90&&score<=100)2223printf("A\n");2425elseif(score>=80)2627printf("B\n");2829elseif(score>=70)3031printf("C\n"J;3233elseif(score>=60)3435printf("D\n");3637else3839printf("E\n");4041return0;4243)复制代码三、选择结构-switch(一)switch结构Switch(值)〃通常是变量Case数值1:语句1;Break;Case数值2:语句2;Break;Case数值3:Break;Default:语句4;Break;)解说:该结构把数值与数值1进行比较,若相等,则执行后面的所有语句,直到遇见break语句跳出整个循环,若前面的条件都不满足,则最终会执行default后面的语句。如果不写break语句,则后面的语句会接连执行,直到遇到break语句或者是全部语句执行完毕,只要前面的条件成立,则后面的判断就直接被忽略。(二)Switch使用注意Charc='A';Switch(c)(Case'A':语句1;Break;Case65:〃不能这样写,因为'A'的ASCII值就是65,会报错语句2;Break;Case数值3:Inta=10;//a的作用域不明确报错,c语言检查变量的作用域根据{}决定,这里可以加{}Break;Default:语句4;Break;)注意:如果要在case后面的语句中定义变量,则必须使用大括号包住。(三)switch结构练习问题:输入一个整数seore代表分数,根据分数输出等级(A-E)oA90-100B80-89C70-79D60-69E0-60代码:复制代码1#include<stdio.h>2intmainQ51〃定义变量存储分数值9intscore;1011〃提示输入1213printf("请输入分值:\n"J;1415〃接受输入1617scanf("%d",&score);1819〃判断等级2021switch(score/10)2223{2425case10:2627case9:2829printf("A\n"];3031case8:3233printf("B\n"J;3435break;3637case7:3839printf("C\n");4041break;4243case6:4445printf("D\n");4647break;4849default:5051printf("E\rT);5253break;5455}5657return0;5859}复制代码【对比】if与switch:LIf语句能够完成的功能,switch有时并不能够完成,如判断if(a>100).在有些情况下,if语句和switch语句可以互换.Switch语句能完成的功能,if语句都可以完成四、循环结构-while(一)简单使用While(条件)语句;)解说:先判断条件是否成立,成立则执行,执行完代码后再次判断条件是否成立(判断条件-》执行代码块-》判断条件-》执行代码块・・・)1.首先确定循环执行的操作,2.在确定约束条件,即需要循环多少次,3.定义一个变量来记录循环的次数。提示:在while循环体内使用if...break(跳出整个循环)或if...continue语句(跳出本次循环,继续下一次循环判断)。While结构的运行原理:①.如果一开始条件不成立,则永远不会执行循环体。.如果条件成立,则执行一次循环体,执行完毕后再次判断条件是否成立。.Break:直接退出整个循环。.Continue:结束当前循环体,进行下一轮循环判断。(二)使用注意While(l)(.….}是一个死循环While(a<10);{...}在条件后面加逗号表示循环体是一个空语句,而非{}部分While条件语句后推荐使用{卜否则只有第一条语句时循环体4)最简单的死循环while(l);〃永远执行空语句,让程序崩溃(三)While练习问题:编程实现,提示输入一个正整数n,计算l+2+3+...n的值。代码:复制代码1#include<stdio.h>intmain。5{〃定义变量保存用户输入的整数intn;while(n<=0){〃提示输入17printf("请输入一个正整数:\n");1819〃接受输入2021scanf("%d",&n);2223)2425intsum=0;2627intnumber=0;//默认被力口的数值2829while(number<n)3031{3233number++;3435sum=sum+number;3637)3839printf("计算结果为:%d\n",sum);4041return0;4243)复制代码五、循环结构-dowhileDo语句}while(条件)特点:dowhile循环至少会执行一次循环体六、循环结构-for(一)基本使用for(语句1,条件,语句2)循环体语句1:一般为初始化语句语句2:一般为增量语句(执行完循环体后再执行的语句)For循环原理:1)For循环一开始就会执行语句1(整个for循环只会执行一次)2)判断条件是否成立,若成立,则执行一次循环体,然后执行语句2,再次判断条件是否成立,若条件不成立则结束循环3)顺序为:(语句1-》判断条件-》循环体一》语句2-》判断条件-》循环体・・・)【对比】for和while:在性能上,for循环稍胜一筹,因为while循环只能使用外部的变量,而for循环可以对变量进行及时回收。(二)for使用注意①.不要随便在for语句后面写上分号,如for。;{…•}②.定义变量的作用域不明确错误forfinti=0;i<5;i++)Inta=10;〃编译器报错,变量作用域不明确.For语句中最简单的死循环for(;;);.需要注意变量定义的作用域Inta=10;Forfinti=0,inta=9;i<5;i++)(Inta=10;Printf("a=%d\n",a);〃这里打印的a的值是多少?)(三)For循环嵌套用以输出特定格式的内容,如QQ好友列表等,提升可扩展性。For(ini=0;i<5;i++)〃外面的循环控制行数Printf(“好友列表%d\n",i);〃内部的循环控制列数Forfintj=l;j<=6;j++)Printf(“好友%(1\11",j);(四)For练习使用for循环输出九九乘法表。〃先控制行数,在控制列数代码:复制代码#include<stdio.h>intmainQ5{forfinti=l;i<=9;i++)9{1011forfintj=l;j<=i;j++)13(1415printf("%dx%d=%d\t",i,j,i*j);1617)1819printf("\n");2021)22return0;)C语言函数一、函数C语言程序是由函数构成的,每个函数负责完成一部分的功能,函数将工恩呢该封装起来,以供程序调用。二、函数定义目的:将一些常用的功能封装起来,以供日后调用。步骤:确定函数名,确定函数体,调用格式:返回值类型函数名(形式参数列表){函数体}三、函数调用定义函数需要明确定的东西:.取一个有意义的函数名.确定函数的形参.编写函数体.返回值示例:Intaverage(intnumljntnum2)(Return(numl+num2)/2;)intmainQ(Inta=l;Intb=3;Intc=average(a,b);〃调用函数Return0;四、参数.形参:定义函数时,函数名后面的参数如numl和num2.实参:调用函数时,传人的具体数据如a和b.形参和实参的个数必须相等.函数体内部不能定义和形参同名的变量.如果是基本的数据类型作为形参,则是纯粹的值传递,修改函数内部形参的值并不会影响到实参的值.一个函数可以没有形参,也可以有无限个形参五、函数的返回值(一)Return的作用:.退出函数.返回一个具体的值给函数的调用者(二)返回值使用注意:.c语言是弱语法弱类型的语言,非常不严格.如果没有写清楚返回值的类型,则默认为int型的.Void代表没有返回值.就算明确声明了返回值类型,也可以不返回任何的值.C语言默认情况下,不允许有两个同名的函数六、函数使用注意.默认不允许函数重名.函数之间是平等的,不能够嵌套定义.函数不可以重复定义,但是可以重复声明,只要是在调用前声明就可以,地方随便.函数如果是只要声明没有定义,那么编译可以成功,但链接时会失效七、多人协作#include<.stdio.h>是一个系统头文件。#include<abc.txt>相当于把abc.txt文件中的所用内容以纯文本的方式拷贝到当前位置。表示文件与.c文件处于同一路径,可以使用相对路径也可以使用绝对路径。左边有/的是绝对路径,没有/则为相对路径。注意:自定义的文件使用“”,系统文件使用<>。函数如果在调用时,函数定义在调用之后,且前面没有进行相应的声明,则编译器报错;调用函数,没有函数声明,编译器不会报错,链接时报错,不定义函数反而不报错。链接:把项目中所以相关的.。目标文件和C语言的函数库合并在一起,生成可执行文件。通常:①.函数的定义放在.C文件中,函数的声明放在.h文件中.如果要是有某个.C文件中定义的函数,只需要包含.C文件对应的.h文件即可..h文件生下来就是打酱油被别人拿来拷贝包含的,编译链接时不用写出八、补充(1)main函数的返回值是返回给操作系统的,。为正常退出,其他值为非正常退出。用以进行系统日志,其实它返回任何值对程序本身没有影响,仅仅只是标记(2)Printf函数的返回值为字符数。如printf(“abc”);则返回值为3,若printf("abc男\n");的返回值为7,因为一个中文占3个字符。C语言内存分析一、进制概念:进制是一种计数方式,是数值的表现形式4种主要的进制:.十进制:0〜9.二进制:0和1③八进制:0〜7.十六进制:。〜9+abcdefC语言在默认的情况下为十进制。Intnum=1010;〃十进制Intnum=ObllOO;〃二进制,以0b或者是0B开头Intnum=014;〃八进制,以0开头Intnum=0x4;〃十六进制,以Ox开头占位符:%[1和%1 :一十进制整数的形式输出一个值%o:以不带符号的八进制输出%X:以不带符号的十六进制输出%U:以不带符号的十进制输出%c:输出字符%p:输出地址%f:输出小数%S:输出字符串N位二进制的取值范围:2位・・・0〜3 0〜2的2次方-13位・・・0〜7 0〜2的3次方-1N位・・・ 0〜2的n次方-1判断以下数据是否正确:0x7h40986.0890b32510e8.796f-.003类型的取值:在64位编译器下,int类型占4个字节共4x8=32bitchar类型占1个字节共lx8=8bit,在内存中以字节为单位进行存储。二、内存分析注意:内存寻址,由大到小。Inta=l;Intb=2;三、类型说明符Short==Shortint%d2Long==longint%ld8Longlong==Longlongint%lld8Signed==Signedint==int%d4(有符号)Unsigned==Unsignedint%u4(无符号)Signed和unsigned的区别在于最高位要不要拿来作为符号位,显然后者的取值范围更大。这两个说明符可和long等说明符组合使用,但不会改变字节数。Unsigned代表int类型的最高位,不必用来作为符号位。四、位运算(一)按位与&功能:只有对应的两个二进制位均为1时,结果才为1,否则为Oo示例:9&5的结果为1100101010001说明:如果位与上1则保留原值,与上0则为0。应用:查询010101110000的倒数第六位是0还是1,则可以与上数值以判断,得出的结果是什么,那么它的原值就是什么。010101110000000000100000000000100000(二)按位或I功能:只要对应的两个二进制位有一个为1则结果为1,否则为Oo举例:9|5的结果为13100101011101(三)按位异或A功能:当对应的两个二进制位不相等时,结果为1,否则为0。举例:9A5的结果为:12100101011100规律:①.相同整数异或的结果为0,如5A5=0②.顺序可以交换。如9A5A9=9人9人5=0A5=5③.任何数值跟0进行异或,结果还是原来的数值。9A0=9aAbAa==b(四)按位取反〜举例:〜9的结果为-100000000000000000000000000000100111111111111111111111111111110110(五)左移<<如a«n把整数a的二进制位全部左移n位,高位丢弃,低位补零。左移n位的结果其实是乘以2的n次方,由于符号位会被丢弃,所以结果可能会改变正负性。举例:9<<1的结果为180000100100100010应用:如果某个数需要乘以2的n次方,那么使用位运算效率更高。(六)右移>>如a»n把整数a的二进制位全部右移n位,低位丢弃,符号位不变,一般情况下高位用符号位补齐。右移的结果实际上是除以2的n次方。(七)练习(1)使用位运算交换两个变量的值复制代码#include<stdio.h>intmainQ5{inta=10;9intb=ll;1011printf("a=%d,b=%d\n",a,b);1213a=aAb;1415b=aAb;1617a=aAb;1819printf("a=%d,b=%d\n",a,b);2021return0;2223)复制代码(2)使用位&运算符判断变量的奇偶性复制代码#include<stdio.h>intmainQ5{printf("请输入需要判断的整数:\n");9 intn;1011 scanf("%d",&n);1213/*1415 if(n%2==0)1617 printf("这个数是偶数\rT);1819 else2021 printf("这个数是奇数\n");23*/2425 if((n&l)==l)2627 printf("这个数是奇数\n");2829elseif((n&l)==O)3031 printf("这个数是偶数\rT);3233 return0;3435)复制代码(3)编写一个函数,输出整数的二进制格式复制代码#include<stdio.h>voidputbinary(intnumber);intmainQ7{printf("这个程序的作用是把你输入的整数以二进制的格式输出\1);1011 printf("请输入一个整数:\n");13131415161718192021)222324intn;scanf("%d",&n);putbinary(n);return0;25voidputbinaryfintnumber)2627{2829 //intcount=sizeof(number)*8-l;3031intcount=(sizeof(number)<<3)-l;〃注意这里需要注明优先级3233 printf("%d\n",count);34353637while[count>=0)3839{4041 intvalue=(number»count)&l;4243 printf("%d",value);4445〃每四个数字,打印一个空格4647if(count%4==0)4849 printf("5051 count-;5253)54555657}5859复制代码五、char类型(一)基础Charc='A';字符在内存中也是也二进制的格式存储的。Intnum=6;〃在内存中以00•••0110存储Charnum=,6';〃对应的ascii码值是54=32+16+4+2,在内存中为110110两者之间有着本质的区别,一个是具体的整数值,一个是字符,以ASCH格式存储。(二)使用注意单引号只能括住单字节的字符,ASCH中的所有字符都是单字节的。Charc=,男';〃错误,因为一个汉字占据3个字节的存储空间Charc="A";〃错误,这是字符串,为‘A'+'0'。Charc=65;〃正确,另一种形式而已Char类型占据一个字节,所以它的取值范围为-128〜127。帮助:输出一个、,使用\\,输出一个单引号使用\',输出一个双引号,使用\"。练习:编写一个函数,将小写字母转换为大写。复制代码#include<stdio.h>charupperfcharc)7{89if(c>='a'&&c<='z')1011returnc-fa'-'A');1213else1415returnc;1617)1819intmainQ2021{2223chara=upper('b');2425printf("%c\n",a);2627return0;2829)复制代码C语言数组一、数组的概念用来存储一组数据的构造数据类型特点:只能存放一种类型的数据,如全部是int型或者全部是char型,数组里的数据成为元素。二、数组的定义格式:类型数组名[元素个数];举例:存储5个人的年龄Intagrs[5];〃在内存中开辟4x5=20个字节的存储空间可以在定义数组的同时对数组进行初始化:Intages[5]={17,18,19,20,21};遍历数组:Forfinti=0;i<5;i++)(Printf("ages[%d]=%d\n",i,ages[i]);).-tv".汪思:(1)数组的初始化®.Intages[5]={17,18,19,20,21);〃一般写法②.Intages[5]={17,18};〃只对前两个元素赋值③.Intages[5]={[3]=10,[4]=ll};〃对指定的元素赋值,这里为第三个和第四个④.Intages□:{11,12,13}.〃正确,右边的元素确定,则个数可以省略这里为3个。⑤.Intages[];〃错误,编译器无法知道应该分配多少的存储空间Intages[5];ages={17,18,19,20,21);//错误,只能在定义数组时这样进行初始化.Intages['A']={1,2,3};〃正确,相当于是ages[65].Intcount=5;intages[count];〃如果不进行初始化,则这种写法正确,编译器不会报错为其分配20个字节的存储空间,ages[0]=l;ages[l]=2;可以像这样对数组的元素进行赋值,但是2,3,4等元素的值时不确定的。.而intcount=5;intages[count]={l,2,3,4,5};〃这种写法是错误的,在定义数组时对数组进行初始化,元素的个数必须为常量或者不写,不能是一个变量(2)计算数组元素当没有表明数组元素个数时,如何对其进行遍历(要求使用数组元素个数)?可以使用sizeof运算符来计算数组元素的个数Intcount=sizeof(ages)/sizeof(int);〃数组的总长度除以单个的长度等于元素个数三、数组内存存储细节假设有数组如下:Intx[]={l,2};Charca[5]={,a;W;B,;C,;D,};数组名即代表数组的地址,数组的地址==数组名(ca)==数组的首元素的地址&ca[O]在内存中,内存从大到小进行寻址,为数组分配了存储空间后,数组的元素自然的从上往下排列存储,整个数组的地址为首元素的地址。模拟该数组的内存存储细节如下:注意:字符在内存中是以对应ASCII值的二进制形式存储的,而非上表的形式。在这个例子中,数组x的地址为它的首元素的地址0x08,数组ca的地址为0x03o四、数组-传址调用Voidchange(intarray[])〃数组可以作为函数的形参,可以省略数组元素的个数Array[0]=100;Voidchange2(inta)〃基本类型作为函数的形参(a=200;)IntmainQ(Intages[5]={l,2,3,4,5};Change2(ages[0]J;Change(ages);Return0;)Array数组与ages数组的地址一致,若以数组作为函数的参数,这种传递方式是传址调用,传递的是整个数组的地址,修改形参数组元素的值,就是修改实参的值。当你把一个数组当做参数来传递时,它会看做是一个指针,在该函数体内使用sizeof运算符来计算数组的长度,得出的数值永远为8,而非数组的实际长度,因为任何类型的指针都占8个字节的存储空间。提示:数组作为一个函数的参数时,如果函数体涉及到数组遍历等操作,通常把数组的实际元素个数也作为参数传递给函数。如voidmaxofarrayfintarray[],sizeof(ages]/sizeof(int)){....}五、二维数组Intages[50];〃数组能够存放50个int类型的数据Intagesl[3][10];〃数组能够存放3个数组,每个数组存放10个数值,共3x10=30个述职数值。一个二维数组a,a包括两个一维数组a[0]和a[l],每个一维数组都包括三个元素。使用场合:五子棋,俄罗斯方块等,假设:charY[3][2]={{CP},{'E,'F'}内存情况:C语言字符串一、字符串基础注意:字符串一定以\0结尾。Printf("yang\n");其中yang为字符串常量,“yang"='y'+'a'+、'+'g'+'\0'。字符串由很多的字符组成,通常使用字符数组来存储字符串,如charname[10]="yang”;也可以以printf(name);的形式输出,即通过数组来访问字符串,但会有警告。因为默认情况下,printf函数只接受字符串常量作为参数(对变量并未写明)。字符串的三种写法:Charname[8]="yang”;〃数组占用了8个字节的存储空间,但是只含有5个字符。Charname[8]={<y,+'a'+'n'+,g'+'\o');Charname[8]={R+匕'+<n,+,g'+,0');这三种写法在内存中的表现都是一样的。

字节地址数组 元素内容0x01dl0x0210x030x040x05name[0]€>y■naroetl]name[2]name[3]i)ai9n4,g0x06nsmcname[4]效0x07name[5]0x08name[6]0x09name[7]Charname[]={<y,+'a'};前面不写个数,不是一个字符串,只能说是一个普通的字符数组。charname[]="yang”;Name[l]='o';把字符串的第二个元素值由a改成o。二、字符串使用注意点(1)分析代码,了解\0的作用。Charname[]="yang”;Charname2[]={<o,+"];Printffuname2=%s>>,name2);%s:根据右边的参数,打印字符串(遇到\0为止)上面代码的打印结果为:okyang下面是内存情况分析:字节地址0x010x020x030x040x05数组元素内谷0x060x070x080x09字节地址0x010x020x030x040x05数组元素内谷0x060x070x080x09name[l]namenamenamenaroe2[0]name2[l]name[O]a问1:Charname[]="y\Ong";则打印结果为什么?(oky)问2:此时打印name的值,使用%$是多少?Y\0ng还是y?(2)Strlen函数Strlen函数计算字符串的长度(字符数)但不包括\0,是字符数不是字数。比如一个汉字占三个字符。Strlen(“haha”);〃长度为4Strlen(“哈haha”);〃长度为7而不是5设charname[]="it'Ocast”;Strlen(name);值为2,因为strlen从字符串的地址开始计算,直到遇到\0为止。假设Charname[]="itcast”;Charname2[]={'o'+,k'};Intsize=strlen(name);此时size的值为8o(3)练习,编写一个函数char_contains(charstr[],charc),如果字符串中包含字符c,则返向1,否则返回0。Intchar_contains(charstr[],charc)(〃遍历整个字符串For(inti=OJ<strlen(str);i++)(If(str[i]==c)Return1;)Return0;)〃调用语句Intresult=char_contains("yang",匕');〃使用while循环①.While[i<strlen(str))®.While(str[i]!='\0')③While(str[i])Inti=-l;while(str[i++]]三、字符串数组二维字符数组,存储两个字符串数组,每个的长度为1,下面是两种写法但存储情况是一样的。Charname[2][10]={"jack”,"rose”};Charname2[2][10]={{丁+七'+,c'+,k'+<\0,},{,r,+,o,+飞’++,\0'})把rose输出:printffu%sn,name2[l]);输出k:printf("%c”,name2[0][3]);前导程序a心1#include<stdio.h>2 3 4 5voidchange(int*);6 7intmainQ8 9{10Hinta=90;1213change(&a);1415printf("a=%d\n",a);1617return0;1819)2021 2223voidchange(int*n)2425{2627*n=10;2829)3031一、基本知识点Inta=10;Int*p;〃定义一个int类型的指针P=&a;〃指针变量p指向了变量a*P=20;〃使用指针不通过变量直接修改变量a的值为20*p表示访问指针变量p指向的存储空间指针一个作用:能够根据一个地址值,访问(取值[赋值)对应的存储空间指针变量P前面的int,表示指针的类型①.Int*p;②,*p=10;两个*的区别:前一个起标识作用,表明定义的p是一个指针,后者的*表示通过访问p指向的地址空间二、指针使用注意.Int*p;doubled=10.0;p=&d;〃不建议此种做法.Int*p;p=200;〃指针变量只能存储地址.Int*p;printf("%d\n”,*p);〃指针变量未经初始化,不要拿来间接访问其他的存储空间Int*p=&a;但是不能写成int*p;*p=&a;这种写法没有任何的意义,可以认为*是和类型符一起使用的。⑤.*是指针运算符,访问指针指向的空间三、指向指针的指针Inta=10;Int*p=&a;〃指向int型的指针Int**pl=&p;〃指向指针的指针Int***p2=&pl;//三级指针

地址:变蚩:地址:变蚩:p2相当于访问pl;*p2相当于访问p;**p2相当于访问a;pl相当于访问p;一颗星一条线。四、指针练习编写一个函数,计算a和b的和与差(一个函数返回两个值)提示:指针的作用之一:实现让函数拥有多个返回值目心1#include<stdio.h>2 3 4 5intSumAndMinusfintnl,intn2,int*n3)6 7{8 9*n3=nl-n2;1011returnnl+n2;1213}14151617intmainQ1819{2021inta=10;2223intb=ll;2425intsum;2627intminus;2829sum=SumAndMinus(a,b,&minus);3031printf("^n=%d,^=%d\n",sum,minus);3233)A五、有关指针的疑问注意:任何类型的指针都占据8个字节的存储空间,那么为

什么还要为指针加上类型呢?对下面一段代码进行内存分析,可以证明指针类型不正确带来的严重后果。Inti=2;Charc=l;Int*p=&c;〃本应该是char类型的,写成了int类型Printf("c的值是%d\n",*p);〃打印结果为513,而非「Printf("c的值是%d\n",c);〃值为1下面是上述代码的结果的内存分析:内容0x0a0001盟指针P访问的数据内容0x0a0001盟指针P访问的数据000000000000000000000000指针p访问的本应该是1个字节空间的数据,此时因为指针的类型是int型的,因此程序自然的从指向的地址0x0a开始读取了4个字节的数据,访问的数据从1变成了513。00000000提示:明确了指针的数据类型,指针才能够正确的访问应该访问的空间数据。六、指针和数组Intages[5]={10,9,8,7,6);遍历数组Forfinti=0;i<5;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论