郝斌老师c语言笔记 TXT,郝斌老师c语言笔记

郝斌老师c语言笔记

int# include stdio.hint main ()return 0;C语言关键字Auto 自动的 break终止 case案件 char const常量 continue继续 default默认 do做 double双 Else否则 enum 枚举 extern额外的 float浮点型 for为了 goto去 if如果 int 整数 long长整型Register寄存器 return返回 short短的 signed有符号的 sizeof运算符 static静止的 struct结构体 switch开关 typedef定义类型Unsigned无符号整数 union 联合 void 空的;无效的 volatile不稳定的 易失的 易变的 while当 directive指示符 fatal 致命的 precompiled 预编译;先行编译C语言的特点:优点:代码量小,速度快,功能强大。缺点:危险性高,开发周期长,相对于java的可移植性不强。C语言的应用领域:主要用于系统软件,很少应用于应用软件。学习方法:多上机。C语言的函数和数学的函数没有太大的函数第11节 课一元二次方程求解:首先要把abc三个系数要保存到计算机了,再求出b的平方减去4倍ac的值。即先要确定解题思路。#include stdafx.h#include math.hint main(int argc, char* argv)int a;int b;int c;float d;float x1;float x2;printf (请输入三个值:n);scanf (%d %d %d,&a,&b,&c);d = (b*b - 4*a*c);if (d0)x1 = (-b + sqrt(d)/(2*a);x2 = (-b - sqrt(d)/(2*a);printf (方程有两个根分别是:x1=%f x2=%fn,x1,x2);else if (d = 0)x1=(-b/(2*a);x2 = x1;printf (方程有两个一样的跟:x1=x2=%fn,x1);else printf (方程没有实根n);return 0;第十四次课计算机的一些基本知识:1:cpu 内存条 硬盘 显卡 主板显示器 之间的关系Cpu不能直接处理硬盘上的文件,通过双击鼠标将硬盘上的数据调用到内存条上,cpu再去处理内存条中的电影数据,处理的结果是将某些数据变成图像,通过显示器。声音通过声卡显示出来。主板上插上硬盘,内存条,声卡,显卡,通过主板将这些东西联系在一起。2:helloworld 程序如何运行起来的通过编译链接:出现后缀式.exe的文件感叹号的操作是由我们的软件会请求操作系统(cpu)来执行这个exe的文件3: 什么是数据类型把数据保存到计算机里面,即是数据的存储。对数据进行分类,整数,实数,字符三类基本类型数据:整数:整型int(4字节),短整型short int(2),长整型long int(8)。定义完之后这个容器只能放提前定义好的数据类型。实数(浮点数,含有小数点的数):单精度浮点数(空间比较小,float 4个字节,),双精度浮点数(空间比较大,double 8个字节,)。字符:单个字符(char 一个字节),字符串(一系列字符的组合,c语言没有东西可以直接存放字符串。以后可以通过字符数组);复合数据类型:结构体枚举(把基本类型拼合在一起,最重要的)共用体4:什么是变量类似一个容器,可以存放不同类型数据。方便对数据的存储。本质是就是内存中的一段存储空间。例如:3最终存放在内存中,程序运行完后就把内存释放。5:cpu内存条vc+6.0操作系统之间的关系请求操作系统分配一段存储空间。来存放变量。6:变量为什么必须要初始化所谓初始化就是赋值的意思7:如何定义变量数据类型 变量名 = 要付的值等价于 数据类型 变量名;变量名 = 要付的值;Int i ,j ;i = j = 5; 等价于 int i = j = 5; i = 5; j = 5 ;8:什么是进制9:常量在c语言中是如何表示的整数十进制十六进制:前面加0x或0X把进驻:前面加0,不是字母o浮点数Float x= 3.2e3;Float x = 123.45e-2字符单个字符用单引号,字符串用双引号。但是“a”代表了a和0的组合10:常量是以什么样的二进制代码存储在我们的计算机中的 用二进制代码把数存储起来的,整数是以补码的形式,实数是以IEEE754,字符和整数的 存储的形式差不多。即字符改变成asc2码,再以补码表示成二进制。11:代码规范化的问题代码规范化,有利于以后写大程序。12:什么是字节就是存储数据的单位,是硬件所能访问的最小单位。cpu只能控制字节,控制不到位。一个字节等于八个位,1k等1024个字节1m等于1024k1g等于1024m13:不同类型数据类型之间赋值的问题暂不考虑14:什么是asc2只能定义字符变量Char ch = A;等价于 char ch ;ch = A;相当于制造出一个容器,再把A放进这个容器中。如果在后面在定义Char ch = B是不允许的,因为不可以同时制造出两个一样的容器。这个代码不是一个值,而是一种规定,规定不同的字符使用那个整数值去表示它规定了一个字母对应一个整数15:字符本质上于整数的存储方式相同基本的输入输出函数的用法Printf ()功能强大,用法灵活。将变量的内容输出到显示中1:printf (“字符串n”);2:printf (“输出控制符”,输出参数);3:printf (“输出控制符1 输出控制符2换行符”,i,j);输出控制符和输出参数的个数必须一一对应。4:printf (“输出控制符 非输出控制符”,输出参数);输出控制符包含%d %ld %c %f 的 为什么需要输出控制符:1:01组成的代码可以表示数据也可以表示指令。2:如果01组成的代码表示的事数据的话那么同样的01代码以不同的格式输出就会有不同的输出结果。 3# include stdio.hInt main(void)Int i = 10:;Printf (“%d”, i); /d是十进制,把二进制代码以十进制输出。X是十六进制。%d输出控制符。 Return 0:标准输入输出#include stdafx.hint main(int argc, char* argv)int x = 47;printf (%xn, x );printf (%Xn, x );printf (%#Xn, x );/推荐使用return 0;/*输出结果是2f2F0X2F*/return 0;2:Scanf (通过键盘将数据输入到变量中)有两种用法用法一:scnaf (”输入控制符“,输入参数);功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。运算符Scanf (”%d“ &i);&为取地址符号知识跳跃 数组:1;为了方便定义大量同类型数据的存储和使用2:数组名是数组第一个元素的地址3:采用循环法赋值例如:int a5=12,11,12,321,123;int b5;int i;for (i = 0;i5;i+)bi = aj;二维数组的的初始化Int a34=,23,,2,2,32吗,23,,2,32,2,,43,;%-5d表示左对齐,每个字符隔五个字符。二维数组的输出:#include stdafx.hint main(int argc, char* argv)#include stdio.hint main(void)int a23 = 12,34,45,423,2342,24;int i,j;for (i = 0;i2;+i)for (j = 0;j3;+j)printf (%-5d,aij);printf (n);return 0;二维数组的输出,利用两个for循环就可以解决。数组其实并不真实存在内存空间中,而是线性分布的。函数:极其重要。(学习c语言的第二个重点。)什么是面向对象的语言。为什么需要函数:避免了重复性的操作。有利于程序的模块化。把大问题分解成小问题。 通过函数来实现细小的问题,体现模块化的思想。修改某一部分对其他部分没有太大的影响。体现程序的健壮性。比较两个数的大小:#include stdafx.hvoid max (int i ,int j)if (ij)printf (%dn,i);elseprintf (%dn,j);int main(void)/表示该函数不接收任何值。Int表示返回值为int类型的数据。函数前面的void表示不返回值。不能与return连用。int a,b,c,d,e,f;a = 1,b = 2,c = 3,d = 4,e = 5 ,f = 6;max (a,b);max (c,d);max (e,f);return 0;什么是函数:逻辑上:能够完成特定功能的独立的代码块物理上:能够接收数据,当然也可以不接收数据能够对接收的数据进行处理,能够将数据处理的结 果返回。当然也可以不反悔。函数是个工具,是为了解决大量类似问题而设计的,函数可以当成一个黑匣子。只要会用,不需要知道系统如何调用。经典指针程序:互换两个数子:#include stdio.h#include stdlib.hvoid huhuan(int a,int b)int t;t = a;b = t;return ;int main()int a = 3;int b = 5;huhuan (a,b);printf (a = %d,b = %dn,a,b);return 0;/这是个经典错误,函数只改变了形参的值,没有改变实参的值。跟主函数没有任何关系。因此不能完成互换功能。#include stdio.h#include stdlib.hvoid huhuan(int a,int b)int main()int a = 3;int b = 5;huhuan (&a,&b);printf (a = %d,b = %dn,a,b);return 0;void huhuan(int * a,int * b)int * t;/如果要互换,t必须定义成int*类型。t = p;p = q;q = t;/这个程序依然不是正确的,因为只是改变了p和q的内容对实参依然没有实际的作用效果。第三个:可以完成#include stdio.h#include stdlib.hvoid huhuan(int * p,int * q)int main()int a = 3;int b = 5;huhuan (&a,&b);printf (a = %d,b = %dn,a,b);return 0;void huhuan(int * p,int * q)/p是int类型的变量,*p是int类型变量。int t;/必须要定义成int类型,否则会出错。t = *p;*p = *q;*q = t;如何修改主函数的值:*号的含义,附注:1、乘法2、定义指针变量Int * p 定义了一个名字叫p的变量,int* 表示p只能存放int类型数据的地址。3、指针运算符,该运算符放在已经定义好的指针变量的前面,如果p是一个已经定义好的指针变量,则*p表示以p的内容位为地址的变量。4、*p在定义好和未定义好的内容是不一样的。 1:使用单个字符用单引号括起来,字符穿用双引号括起来。int main()int * p;/等价于int *p,等价于int* p。int i = 5;char ch = A;p = &i ;/修改p和i的值互不影响。*p表示以p的内容为地址的变量。*p = 99;printf (i = %d,i);return 0;#include stdio.h#include stdlib.hvoid swap_1(int i,int j)int t;t = i;i = j;j = t;int main()int a = 3;int b = 5;swap_1(a,b);printf (a = %d,b = %d,a,b);return 0;互换两个数:#include stdio.h#include stdlib.hvoid f(int *p,int *q)int t;t = *p;*p = *q;*q = t;int main()int i = 6;int j = 7;printf (i = %d,j = %dn,i,j);f(&i,&j);printf (i = %d,j = %dn,i,j);return 0;指针使函数返回一个以上的值:通过利用*p和i等效的原理来进行数组和指针:数组名:下标和指针的关系:指针变量的运算:以为数组名是指针常量,他存放的是一位数组第一个元素的地址。指针和数组:界定一个一位数组需要几个参数:一般情况下需要两个参数,数组名和数组长度。# include stdio.hvoid f (int *p,int n)int i;for (i = 0;i n;i+)printf (%pn,*(p+i);int main ()int a5 = 1,2,3,4,5;int b6 = 6,78,-1,-45,12,546;int c100 = 1,99,27,33;f(a,5);printf (n);f(b,6);printf (n);f(c,100);printf (n);return 0;通过函数把数组的数组名发给指针变量p,则有:*(p+1)= a【i】,p【i】=a【i】,*(a+i)= a【i】 = *(p+i)= p【i】个可以等效替换,无任何区别。# include stdio.hvoid f (int *p ,int len )int i;for (i = 0 ;i len; i+)*(p+i) = *(p+i)+10;pi = pi*0;pi = *(p+i)+10;*(p+i) = pi*0;printf (%dn,pi);int main (void)int i;int a6 = 1,3,4,5,566,45;/printf (%dn,a3);f (a,6);printf (从这里重新开始。别闹了,孩子;n);/for (i = 0;i 6;i+)/printf (%dn,*(a+i);return 0;指针变量的运算:指针变量不能相加,相乘和相除。只能相减:如果两个指针变量指向的是同一块连续空间的不同存储单元,则这两个指针变量可以相减。表示两个指针变量相隔的个数。# include stdio.hint main (void)int j = 5;int i = 10;int *p = &i ;int *q = &j ; int a5;p = &a1;q = &a4;printf (%dn,p-q);return 0;一个指针变量到底占几个字节:假设P指向char类型的变量 1假设q指向int类型的变量 4假设r指向double类型的变量 8预备知识:Sizeof(数据类型)功能:返回值就是该数据类型所占的字节数。例如:sizeof(int)= 4;# include stdio.hint main (void)char ch = A;int i = 99;double x = 66.6;char *p = &ch;int *q = &i;double *r = &x;printf (%d,%d,%dn,sizeof(p),sizeof(q),sizeof(r);return 0;运行结果:4,4,4请按任意键继续. . .X变量有8个字节,用首字节的编号当成x 的编号。总结:一个指针变量不论指向什么变量,该指针变量本身都只占四个字节。一个变量的地址使用该变量的首字节来表示的。专题:动态内存分配的问题非常非常重要。传统数组的缺点:1:数组长度必须事先制定,并且只能是常指数。长度不能是变量。2:传统形式定义的数组,该数组的内存程序员无法手动编程释放他。他只能在自己所在函数运行完之后自动释放。但是动态内存可以自由释放。在一个函数运行期间系统为该函数中数组分配的空间就会一直存在,直到该函数运行完毕。3:数组的长度不能在函数运行的过程中动态的扩充和缩小。数组的长度一旦定义,其长度就不能够改变,4:a函数定义的数组,在a函数运行期间可以被其他函数调用,但是当a函数结束后,就不能被其他函数调用。传统方式定义的数组不能跨函数使用。为什么需要动态内存分配:动态内存就像个救世主一样很好的解决了传统数组的缺陷。(静态数组)# include stdio.h# include malloc.h /不能省 void f (int *q) *q = 200;printf (%dn,*q);int main (void)int i = 5;int *p = (int *)malloc(4);/一共分配了8个字节 /*1;要是用这个函数必须添加头文件2;malloc函数只有一个形参,并且形参是整形3;4表示请求系统为本程序分配四个字节*4;malloc函数会为我们分配若干字节,只能返回第一个字节的地址5;8行分配了八个字节,p变量站四个字节,p所指向的内存也占四个字节 6;p本身所占的内存是静态分配的,p所指向的内存是动态的7;malloc返回的是他所分配的内存的第一个字节的地址8;(int*) ,是强制类型转换,是用来告诉别人这个地址所指向的数据时什么类型, */*p = 5;/*p代表的就是一个int变量,只不过*p这个整形变量的内存分配方式和第九行i变量的分配方式不同 / free (p);printf (tong zhi men hao !n);/p本身的内存不能被释放f(p); return 0;动态内存分配举例-动态数组的构造:1:malloc函数的使用:malloc 是memory内存allocate分配)的缩写。#includestdio.h#include malloc.hint main ()int *p ;int len ;int i ;printf (输入一个数:);scanf (%dn,&len);p = (int *)malloc(4*len);for (i = 0 ;i len ;i+)printf (请输入Len个数:n);scanf (%dn,pi);pi = pi+5; for (i = 0;ilen;i+)printf (一位数组改为:%dn,pi);return 0; #include stdio.h#include malloc.hint main ()int *p ;int len;int i;printf (shuruyigeshu:);scanf (%dn,&len);p = (int *)malloc(4*len);for (i = 0;ilen;i+)printf (请输入len个数:);scanf(%dn,pi); pi = pi+5;for (i = 0;i len ;i+)printf (yiweishuzugaiwei:%dn,*(p+i);return 0;# include stdio.h# include malloc.hint main ()int i;int len ;int *p;printf (输入一个数:);/printf (请输入Len个数:n);scanf (%dn,&len);/p = (int *)malloc(4*len);/定义一个动态数组 /printf (请输入Len个数:n);p = (int *)malloc(4*len);for (i = 0 ;i len ;+i)scanf (%d,&pi); printf(一位数组的内容为:); for (i = 0;i len ; +i)printf (%-5d,pi);return 0;1;长度不需要事先确定。2;可以被程序员手动释放。3;动态的增加和较少。4;动态的数组和静态的数组使用方法是一样的。静态内存和动态内存的比较:多级指针就是指针调用指针。# include stdio.hint main ()int i = 99;int *p = &i;int *q = &p;int *r = &q;数p,*q,*r); return 0;*运行结果:99 99 99 99请按任意键继续. . .跨函数使用内存的问题:暂时告一段落 :待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值