P转C语言速成手册

上传人:无*** 文档编号:45463816 上传时间:2021-12-07 格式:DOC 页数:43 大小:142KB
收藏 版权申诉 举报 下载
P转C语言速成手册_第1页
第1页 / 共43页
P转C语言速成手册_第2页
第2页 / 共43页
P转C语言速成手册_第3页
第3页 / 共43页
资源描述:

《P转C语言速成手册》由会员分享,可在线阅读,更多相关《P转C语言速成手册(43页珍藏版)》请在装配图网上搜索。

1、Pascal转C 及DEV C+ GDB编译调试介绍路中信息学资料介绍、编辑与整合2C语言速成手册(一):基本数据类型、标准输出、函数2语句和语句块2注释的写法3常用数据类型3定义变量3定义常量4基本数学运算4关于字符类型5C语言中的赋值5程序员面试题(1)P355类型转换与“名词动用”7程序员面试题(1)P407标准输出7函数的定义、返回和调用9一个完整的程序代码的构成11C语言速成手册(二):布尔值、条件判断、循环12逻辑运算符12C语言的if语句12程序员面试题(2)P3913C语言的bool类型14C语言的for循环15C语言的while循环16程序员面试题(2)P3917switch

2、语句17goto语句18C语言速成手册(三):数组、字符串、结构18一维数组的定义、初始化和使用18C语言中的字符串20多维数组的定义、初始化和使用21结构的定义、初始化和使用22C语言速成手册(四):指针、动态内存分配、标准输入24指针的定义24取地址与引用24动态内存分配24指针与结构25指针与函数26指针与数组28标准输入30C语言速成手册(五):其它运算符、文件操作、其它函数31条件运算符31自加、自减31其它运算符32各种标准输入输出函数32内存输入输出操作33文件输入输出操作33整型上下限35常用数学函数35常用字符串函数36内存操作函数37stdlib.h提供的其它函数37利用a

3、ssert帮助调试38C语言速成手册(六):其它问题、后记39预处理指令39static声明41short类型和int类型的范围41对64位整型的处理41查漏补缺42后记42资料介绍、编辑与整合C语言速成手册:Matrix 67(北大中文系 顶尖牛人)程序员面试宝典:孙文达(微软技术顾问,全球TOP3讲师) C语言速成手册(一):基本数据类型、标准输出、函数语句和语句块和Pascal一样,C语言的每条语句以分号结尾。    和Pascal一样,单词和语句间的空格、回车符对编译没有影响。    C语言的语句块用花括号

4、标识,也就是说字符 相当于Pascal的begin,字符 相当于Pascal的end; 。语句块中最后一条语句末尾的分号不能省略。    如果语句块里只有一条语句,语句块的标识可以省略。这就好像Pascal代码:for i:=1 to n dobegin    writeln('I Love You');end;    里面的begin和end可以省略一样。注释的写法两种情形被认为是注释。符号/ 的后面(只限一行),以及符号 /* 和 */ 之间(可以跨行)。

5、例如:/*  =    = THIS IS A COMMENT =    =   */  This is a comment. 常用数据类型C                  |  Pascal-+-short    

6、          |  shortint                |  integer (实际数据范围等同于longint)long             &#

7、160; |  longintlong long          |  int64unsigned short     |  byteunsigned int       |  wordunsigned long      |  dwor

8、dunsigned long long |  qwordfloat              |  realdouble             |  doublechar         

9、      |  char特别指出:无符号数据类型也可以表示负数,它可以描述的数据范围包含了有符号区域,但是我不太敢用,建设最好也别去混用!具体差异尚不清楚。定义变量    定义变量使用这样的格式:类型名 变量名1, 变量名2, . , 变量名n; (,而)    变量名的命名规则与Pascal相同:只能用大小写字母、数字或下划线,第一个字符不用数字。所不同的是,C语言中定义的名称要区分大小写。    例如

10、,下面的两条语句定义了三个整型变量和一个字符变量。int a,b,c;char ch;    类型名在前,和Pascal不同,Pascal在后,并且变量的声明不一定要在整个代码前。你可以在程序中任意一个地方定义一个新的变量。定义的变量只能在当前函数(中的当前语句块)后面的代码中使用。比如当前变量你是在int m内说明,不好意思,出了该范围就翻脸不认人了。另外,在当前区域块中,只能在区域内变量定义以下范围中可用。也就是说,不同函数之间的变量不能混用,在某循环里定义的变量在循环外面是无效的。定义在函数外的变量将作为全局变量供后面的函数使用。定义常量 

11、;   为了告诉编译器某个变量不会改变,你可以在变量定义前加一个const。例如,下面的语句定义了一个常数:const int maxn=2000;比较有意思的一点是,常量运用经常也可以在函数形参接口处看到,通常也可以对指针形参做常量说明,这一点应该说是不错的。基本数学运算  作用   |  C  | Pascal-+-+-   加    | +   |  +   减

12、    | -   |  -   乘    | *   |  *   除    | /   |  / 或 div ,  取余   | %   |  mod    如果要做除法运算,而不是div整除,请

13、让你的操作数类型转换为float、double,若均为整型,则做div运算。除法的结果是整数还是小数取决于参与运算的数是整数还是小数。10 / 4等于2,但写成 10.0 / 4 或 10 / 4.0 就得2.5了。关于字符类型C语言中的字符用一对单引号' '标注。例如,'A'表示字符A。    无法打印或可能产生冲突的字符用反斜杠加一个字符来表示,这叫做转义符。常用转义符如下:n  换行t  Taba  响铃"  双引号'&

14、#160; 单引号?  问号  反斜杠    因此,'''表示一个单引号,虽然它看上去像是两个字符。    字符类型可以依照ASCII码进行数学运算。例如,字符变量ch可能被赋值为'A'+2(这样ch就等于'C'),而'0'+'1'则等于'a'。字符变量的使用神通广大,说白了,有时候你就把它当shortint整数运算还不够,使用起来特爽!C语言中的赋值和Pasca

15、l不一样,C语言的赋值只用一个等号,等号前没有冒号。真正的等号为:= =,刚开始使用时经常会眼花。数组使用时,请一定要注意给它初始化一下,否则有时候会莫明其妙地出错。如:int a10=0;     声明变量时后面可以跟一个等号赋初始值。这一点还是不错的。    下面的语句都是合法的: int a=3, b=106, c=a+b, d; char ch = c - '0' d = a * b;另:复合赋值 如:i=i+2 i+=2 两者间是等价的。程序员面试题(1)P35面试题1:What does

16、 the following program print?(中国台湾某著名计算机硬件公司12月份面试题)P35页int x=2,y,z; x*=(y=z=5); printf("%4d",x); z=3; x=(y=z); printf("%4d",x); x=(y=z); printf("%4d",x); x=(y&z); printf("%4d",x); x=(y&&z); printf("%4d",x); y=4; x=(y|z); printf("%4d

17、",x); x=(y|z); printf("%4d",x);面试题2:What will be the output of the following code (assume the necessary include files are present)?(下面程序的结果是什么?)中国台湾某著名杀毒软件公司10月份面试题 P37int i=3,j=4; i?i+:+j; printf("%d %dn",i,j);面试题3:P37int i=1,j=2; int k=i+j; printf("%dn",k);面试题4:P

18、38x=x+1, x+=1, x+, 哪个效率最高?为什么?面试题5:中国台湾某著名CPU生产公司10月份面试题#define product(x) (x*x)int main(int argc, char *argv) int i=3,j,k; j=product(i+); k=product(+i); printf("j=%d,k=%dn",j,k); system("PAUSE"); return 0;面试题6:P39int a=5, b=3;!a&&b+;printf("a=%d,b=%dn",a,b);类型转

19、换与“名词动用”C语言中,不同类型的变量可以相互赋值,程序将自动转换类型(即使是数字与字符之间)。    C语言中也存在“使动”用法(类似于Pascal中使用int64(a)扩展变量长度的用法)。假如a是整型,(double)a表示“实数版的a”;假如ch是一个字符,(int)ch就相当于Pascal中的ord(ch)。    考虑下面的代码:int a;int b;char c;double d,e;a = 'z'b = 20.736;c = b + 28;(类型转换与提升时,要注意方向,所谓方向

20、是说从A种类型可以提升为B种类型,反过来却不一定可行)d = a / b;e = (double) a / b;    这段代码中,a最终被赋值为122,b得到的值是20,而c的值则为字符'0';d获得的值为6.0,而e的值是6.1 。程序员面试题(1)P40下面程序的结果是什么?中国台湾某著名CPU公司10月份面试题char foo(void) unsigned int a=6; int b=-20; char c; (a+b>6)?(c=1): (c=0); return c;标准输出输出使用printf函数。printf函数的

21、使用方法如下:printf (字符串, 待输出表达式1, 待输出表达式2, . , 待输出表达式n );     C语言的字符串用一对双引号"  "注明,里面允许有转义符。printf将把字符串输出到屏幕上。字符串中可以有若干个标识,这些标识帮后面待输出的内容“占一个位置”。常用的标识格式为%x.y(c|d|f|e|g),其中x表示输出占的宽度,y表示保留位数;c,d,e,f四个字母表示输出类型,你需要选择一个。c表示输出字符,d(也可以用 i )表示输出整数,以10进制显示;%5d ,%-5d; 此外,%i还可以

22、读入8进制0、10进制、16进制 0xf表示输出小数,e用科学计数法表示小数。%10.3eg %-10gu ?printf后面的参数依次“填入”这些标识。注意d和e,f不能混用,也就是说,你不能把一个小数输出成整数格式,或把整数输出成小数格式(除非事先转了类型)。    特别地,%表示输出一个百分号。,此种方式可以输出许多其它符号。    观察下列代码片段printf ("Welcome to M n");printf ( "4 + 5 = %dnand 4 - 5 = %dnn&qu

23、ot;, 4 + 5 , 4 - 5 );int a = 102;printf ( "2 * a = %.5dn" , 2 * a );printf ( "2 * a = %fn", (double) 2 * a );printf ( "2 * a = %8dn"  , 2 * a );printf ( "2 * a = %8.5dn", 2 * a );printf ( "a = '%c'nn", a );double b = 7;printf ( &quo

24、t;a / b = %fn", a / b );printf ( "a / b = %en", a / b );printf ( "a / b = %.9fn", a / b );printf ( "a / b = %.3fn", a / b );printf ( "a / b = %8.3fn", a / b );printf ( "b / a = %.3f%nn", b / a * 100 );char c = 'A'printf ( "c = %cn&q

25、uot;, c );printf ( "c = %3cn", c );printf ( "c = %dn", c );printf ( "%c%c%c%c%c%c%n",c+12,c+32,c+51,c+49,c+40,c+55,a-35);    程序输出的结果为:Welcome to M4 + 5 = 9and 4 - 5 = -12 * a = 002042 * a = 204.0000002 * a =      2042 *

26、a =    00204a = 'f'a / b = 14.571429a / b = 1.457143e+001a / b = 14.571428571a / b = 14.571a / b =   14.571b / a = 6.863%c = Ac =   Ac = 65M函数的定义、返回和调用定义一个函数的格式如下:函数返回类型 函数名( 参数类型1 参数名1, 参数类型2 参数名2, . , 参数类型n 参数名n )    函数内容Pascal中可以

27、function func1(a,b:integer;c:longint):longint; C中必须long func1(int a,int b,long c);2.stdbool.h中的bool型不能像P一样直接输出,我自己还猜了个%b.3.随机数讲得很不清楚,但确实比P的randomize复杂一些。    C中没有过程这一说法,如果某个函数不返回任何数据(相当于Pascal中的“过程”),函数返回类型要写成void。当然你有权保持沉默,不写返回类型,则函数默认返回类型为int。    如果某个函数不带任何参数

28、,参数表一般留空(也可以用一个void代替)。    为了强调某个参数在整个函数中始终不变,类型前可以标明const。这一点C中特色,常见于指针类型。    函数的返回使用下面的语句:return 表达式;    执行这条语句将立即终止该函数的运行。    下面定义的一个函数可以返回三个数的平均值:double average (double a , double b , double c)  double sum=

29、a+b+c;  return sum/3;    C语言也支持函数的内联,方法是在函数返回类型前加inline。例如:inline double average (double a , double b , double c)  double sum=a+b+c;  return sum/3;    函数的调用方法和Pascal一样。如果调用函数所带的参数类型和定义的不一样,程序会自动转换类型。下面的语句合法地调用了刚才定义的函数:num = averag

30、e( 2, 6.5, 4.23 );    有一点不同的是,当所调用的函数不带参数时仍然要写括号,例如:void writeMessage()   printf("Welcome to M");void output()   writeMessage();    C语言同样支持递归调用。由于C语言也只能调用前面定义过的函数,因此C同样需要类似于向前引用的方法。具体方法是把需要提前引用的函数的第一行复制一份提到前面去。下面的两种做法都是正确的,其中第一种方法

31、允许在output函数里调用后面的average,第二种则允许在这句话后面的所有函数中调用它。void output()   double average (double a , double b , double c);   printf( "%f",average( 2, 6.5, 4.23 ) );double average (double a , double b , double c)  double sum=a+b+c;  return sum/3;double average (

32、double a , double b , double c);void output()   printf( "%f",average( 2, 6.5, 4.23 ) );double average (double a , double b , double c)  double sum=a+b+c;  return sum/3;    事实上,向前引用时参数名已经没有意义,因此参数名可以省略,直接写成这样:double average (double , double

33、, double );    C语言中也允许在函数中定义子函数(函数的嵌套)。标准的C语言不支持在函数中定义子函数(函数的嵌套),虽然某些编译器可能支持。一个完整的程序代码的构成    代码前几行用于包含头文件,每行包含一个,格式如下:#include <头文件名>    常用的头文件有stdlib.h, stdio.h, string.h, math.h等等,分别提供一些常用函数、输入输出函数、字符串函数和数学相关函数。注意我们之前用的printf函数是属于st

34、dio.h里的,因此要使用该函数必须在代码最开头加入#include <stdio.h>。    接下来是若干个函数。这些函数里必须有一个名为main的函数,它返回的值是一个int类型,代表程序的退出代码(0=正常退出)。程序会自动寻找这个函数作为主函数执行。    下面的代码是一个完整的C程序代码,这是我们的第一个完整的程序代码:#include <stdio.h>double average (double a , double b , double c)  doub

35、le sum=a+b+c;  return sum/3;int main()   double a=24;   double b=102;   double c=77;   printf("Matrix%原创n转贴请注明出处", (int)average(a,b,c);   return 0;C语言速成手册(二):布尔值、条件判断、循环 逻辑运算符作用   |  C  | Pascal 

36、 -+-+-    等于   | =  |  =   不等于  | !=  |  <>    小于   | <   |  <    大于   | >   |  > 

37、 小于等于 | <=  |  <=  大于等于 | >=  |  >=     且    | &&  |  and     或    | |  |  or     非&#

38、160;   |  !  |  notC语言的if语句C语言中if语句的写法如下:if (表达式)    表达式为真时执行的内容    之前说过,如果执行的内容只有一句话,花括号可以省略。    下面的语句将返回整数a的绝对值:if ( a<0 )   a= -a;    下面的语句用于实现排序网络中的比较算子:if (

39、a>b )   int c=a;   a=b;   b=c;     C语言中也有else if和else的用法,但和Pascal不同的是else的前一条语句末要保留分号。下面的语句用于判断三边长分别为a, b, c的三角形是什么三角形:if ( a+b>c && b+c>a && a+c>b )  if ( a=b && b=c )    printf("

40、;Regular Triangle");  else if ( a=b | b=c | a=c )    printf("Isosceles Triangle");  else    printf("Scalene Triangle");else  printf("Triangle Doesn't Exist.");程序员面试题(2)P39We have two pieces o

41、f code,which one do you prefer,and tell why.(下面程序有两种写法,请告诉我你青睐哪种,为什么?)美国某著名计算机嵌入式公司10月份面试题/ a is a variable写法1:if (A=a) a+;写法2:if(a=A) a+;C语言的bool类型C语言中没有布尔类型。任何一个整型的变量都可以充当布尔变量,用0表示False,其它数(默认为1)表示True。    观察下列代码片断。printf("%d n", 3+5 = 8);int a;a = 3+5=9;printf("

42、%d n" , a);a = 100 <= 100;printf("%d n" , a);a = 1;if(a) printf("a is 1n");a = 2;if(a) printf("a is 2n");a = -1;if(a) printf("a is -1n");a = 0;if(a) printf("a is 0n");if(!a) printf("a is not 0n");    这段程序的输出为:101

43、a is 1a is 2a is -1a is not 0    如果觉得别扭,你可以使用_Bool类型。你可以把_Bool看作整型,但它只能储存0和1两个值。    下面三句话将输出数字1,这是因为_Bool类型把所有非0数都当做是1。_Bool a;a = 100;printf("%d", a);    如果你想像Pascal一样使用true和false,那么你可以包含头文件stdbool.h。这样你可以定义变量为bool类型并赋值为true或fals

44、e。例如:bool a = true;if (a) printf("a is true");    下面是两个完整的程序。第一个程序中_Bool可以替换成int。三种写法都正确,你可以选择一种自己喜欢的写法。#include <stdio.h>_Bool isNegative ( int a )   if (a<0) return 1;   else return 0;int main()   if ( isNegative(-100) ) 

45、60;   printf("-100 is Negative");   return 0;#include <stdio.h>#include <stdbool.h>bool isNegative ( int a )   if (a<0) return true;   else return false;int main()   if ( isNegative(-100) )     printf(&quo

46、t;-100 is Negative");   return 0;C语言的for循环for循环使用下面的语句:for ( 语句1; 语句2; 语句3 )    循环内容    其中语句1用于初始化,若语句2为真(非0)则进入循环;每次循环后将执行语句3,此时若仍然满足语句2则继续循环,否则退出。语句123中,某一种语句可能为空,也可能由多条语句组成(多条语句用逗号隔开)。    下面的语句打印1到10这10个数。以下所有写法都是正确的。通常用第一

47、种写法。int i;for (i=1; i<=10; i=i+1)   printf("%dn", i );int i=1;for ( ; i<=10; i=i+1)   printf("%dn", i );int i;for (i=1; i<=10; )   printf("%dn", i );   i=i+1;int i;for (i=1; i<=10; printf("%dn", i ), i=i+1 );

48、    巧妙地应用for循环可以使某些操作非常简单。下面的函数可以计算n的质因子个数:long countPrimeFactor( long n )  long d, count;  for (d=2, count=0; n>1; d=d+1 )     for ( ; n%d=0; count=count+1, n=n/d );  return count;    下面的语句将产生死循环:for ( ; ;

49、) ;C语言的while循环while循环格式如下:while ( 循环条件 )   循环内容    下面的代码计算1394和6150的最大公约数:int a=1394, b=6150;while ( b )   int tmp = a % b;   a = b;   b = tmp;printf("The gcd is %d", a);do.while循环    do.while循环的格式如下:do &#

50、160;  循环内容while ( 循环条件 );    将条件放在循环内容的后面,使程序至少执行循环内容一次。循环控制    C语言中使用break语句和continue语句来控制循环,其使用方法与Pascal完全一样。程序员面试题(2)P39We have two pieces of code,which one do you prefer,and tell why.(下面程序有两种写法,请告诉我你青睐哪种,为什么?)美国某著名计算机嵌入式公司10月份面试题写法1:for(i=0;i<

51、8;i+) x=i+y+j*7; printf(“%d”,x);写法2:s=y+j*7;for (i=0;i<8;i+) printf(“%d”,i+s);switch语句switch语句相当于Pascal中的case语句。    下面代码的输出为2 3 default done! , 因为switch语句只负责把程序运行的位置跳转到相应的地方。int n=2;switch (n)    case 1: printf("1 ");    case 2

52、: printf("2 ");    case 3: printf("3 ");    default: printf("default ");printf("done!");    你可以用break语句实现Pascal的case,例如下面的写法就可以让程序输出2 done! :int n=2;switch (n)    case 1: 

53、0;     printf("1 ");       break;    case 2:        printf("2 ");       break;    case 3:        pri

54、ntf("3 ");       break;    default: printf("default ");printf("done!");goto语句你可以在程序的任何位置插入一个标签:标签名:    并在同一函数里使用下面的语句实现无条件跳转:goto 标签名;    例如,下面的代码将产生死循环,并输出满屏幕的求爱信息。a: printf("

55、; I Love You ! ");goto a;C语言速成手册(三):数组、字符串、结构 一维数组的定义、初始化和使用定义一个一维数组的格式如下:类型 数组名数组大小;    数组的下标范围总是从0开始(因此下标最大为数组大小减一)。下面一行语句定义了一个大小为10的长整型数组:long value10;    这相当于下面的Pascal语句:var value:array0.9of longint;    C语言的数组范围左端点不能自定义,它的数组下标只能从0开

56、始。    下面几种方式可以在定义数组的同时进行初始化:long value10 = 0, 8, 2, 0, 3 ;long value10 = 1=8, 2=2, 4=3 ;    上面两个语句是等价的。其中前一种方法依次对数组的前5个数进行初始赋值,后一种方法仅对数组的其中三个位置进行初始化。初始化中没有涉及到的下标所对应的数值自动被设为0。    C语言允许数组的大小为一个变量,但这样的数组在定义时不能像上面一样进行初始化。    

57、;这种初始化方法只在定义数组时用,不能用于程序中的赋值。数组之间也不能直接赋值,你不能把数组a整个赋值给数组b。    程序中使用数组的方法和Pascal一样。下面的程序将输出1000以内的素数:#include <stdio.h>#include <stdbool.h>int main()   bool isPrime1000;   int i,j;      for(i=2;i<1000;i=i+1)   

58、60;  isPrimei=true;         for(i=2;i<1000;i=i+1)         if (isPrimei)                printf("%d ",i);  &#

59、160;       for(j=2*i;j<1000;j=j+i)             isPrimej=false;                  return 0;    当一维数组作为函数参数时,数组大小可以

60、不写,以适应不同长度的数组。通常你还需要另一个参数告诉函数你的数组有多大。下面这个函数返回数组中的最大值:long maxValue ( long length, long array )   long i, max = 0;   for ( i=0; i<length; i=i+1)      if (arrayi>max) max = arrayi;   return max;    下面的代码合法地调用了上面的函数。l

61、ong a5 = 1, 5, 7, 3, 4 ;printf( "%d" , maxValue( 5,a ) );C语言中的字符串C语言也使用字符数组作为字符串。定义一个char a20,就相当于定义了一个长度不超过20的字符串。Pascal中使用a0记录字符串的长度,字符串内容从a1开始;但C语言并不直接记录字符串长度,a0表示字符串的第一个字符,最后以ASCII码0(或写成字符'0')标记字符串结尾。你可以直接将一个字符串赋给字符数组,也可以在printf中使用%s标识输出一个字符数组。记住,a2表示字符串中的第三个字符,因为C的数组下标是从0开始的。&

62、#160;   观察下列代码:int i;char a20=""for (i=0;i<20;i=i+1)   printf("%d ",ai);printf("n%cn",a2);printf("%sn",a);printf("%16sn",a);printf("%.8sn",a);printf("%16.8sn",a);    程序的输出为:109 97 11

63、6 114 105 120 54 55 46 99 111 109 0 0 0 0 0 0 0 0t    matrix67        matrix67    = 或 + 等运算符对字符串无效。    下面的函数返回字符串的字符数:int stringLength( char a )   int count=0;   while ( acount )&#

64、160;     count=count+1;   return count;    赋值时,如果字符串太长了,有两种方法可以让你分行写。一是在行末加一个反斜杠表示和下一行相连,二是每一行都用双引号注明(编译器会自动把它连接起来)。下面两个代码是等价的。注意第一个代码中的第二行必须顶格写,否则第二行前面的空格也要算进字符串里。char blogTitle100="Matrix67: My Blog - 50% Informatics, 50% Mathematics, and

65、 50% Imagination"char blogTitle100="Matrix67: My Blog - 50% Informatics, 50% "                 "Mathematics, and 50% Imagination"    和数组一样,对字符串的赋值只能在定义时使用,程序中不能这样做。多维数组的定义、初始化

66、和使用定义一个多维数组的格式如下:类型 数组名大小1大小2.大小n;    例如,下面这个语句定义了一个三维数组:int matrix1001002;    同样地,每一维的大小都是从0开始算的。因此上面的语句相当于Pascal中的:var matrix:array0.990.990.1of integer;    多维数组的初始化和一维数组类似。例如,我们经常需要定义方向常量:const int dir42 = 1,0,0,1,-1,0,0,-1 ;  

67、  这还可以直接写成:const int dir42 = 1, 0, 0, 1, -1, 0, 0, -1 ;    多维数组的初始化同样是未定义者自动填零,因此还可以写成:const int dir42 = 00=1, 11=1, 20=-1, 31=-1 ;    程序中使用多维数组时必须用多个方括号,即dir21不能写成dir2,1。    当多维数组作为函数的参数时,只有第一维的大小可以不写。因此,下面的三个函数中前两个是合法的,第三个是不合法的。

68、long function_1( int m, int n, long a2020 );long function_2( int m, int n, long a20 );long function_3( int m, int n, long a );    为了让参数仍然适用于各种大小的数组,C语言允许这样定义函数:long function_4( int m, int n, longmn );    例如,下面的函数递归地计算行列式:long determinant( int n, long ann )

69、0;   if (n=1) return(a00);        int i,j,k;    long ans = 0;    long subn-1n-1;        for ( i=0; i<n; i=i+1 )        

70、60;   for ( j=1; j<n; j=j+1 )                   for ( k=0; k<i; k=k+1 )              subj-1k=ajk;   

71、0;       for ( k=i+1; k<n; k=k+1 )              subj-1k-1=ajk;                ans = ans + (1-i%2*2)*a0i*determinant(n

72、-1, sub);        return ans;        下面的代码片段正确地调用了上面的函数:long a44=               1, 4, -1,  4 ,        

73、;       2, 1,  4,  3 ,               4, 2,  3, 11 ,               3, 0,  9,  2 &

74、#160;            ;printf( "%d" , determinant(4,a) );结构的定义、初始化和使用Pascal中的记录类型在C语言中叫做“结构”。定义一个结构的方式如下:struct 结构名   在此定义若干变量(域);    注意花括号后面需要有一个分号。下面定义一个date结构:struct date   int year;   sh

75、ort month,day;    这样你就获得了一个名为struct date的类型名。和变量的定义一样,一个结构的定义只能供当前函数(的当前语句块)中后面的部分使用。因此通常把结构的定义放在所有函数的前面作为一个全局的定义。之后,你便可以写这样的语句:struct date today;    结构的使用方法同Pascal的记录类型一样。例如,下面的函数用于计算某一天是星期几(Zeller公式):int zeller( struct date t )   if (t.month<3)&

76、#160;        t.year = t.year - 1;      t.month = t.month + 12;      int c = t.year / 100;   int y = t.year % 100;   int ans = ( c/4 - 2*c + y + y/4 + (26*(t.month+1)/10 + t.day - 1 ) % 7; &#

77、160; if (ans>0) return ans;   else return ans+7;    给一个结构赋初始值和数组的初始化差不多。下面两个语句是等价的:struct date myBirthday = 1988, 5, 16 ;struct date myBirthday = .year=1988, .month=5, .day=16 ;    这种方法也可以用于程序中的赋值操作,但需要加上一个类型转换(见这里的“名词动用”一节)。例如,下面三个代码片段都是等价的:myBir

78、thday.year = 1988;myBirthday.month = 5;myBirthday.day = 16;myBirthday = (struct date) .year=1988, .month=5, .day=16 ;myBirthday = (struct date) 1988, 5, 16 ;    下面的语句调用了zeller函数,输出自1583年来的每个13日都是星期几。和本文无关的问题:有人知道为什么我从1583年开始算么?int y,m;for ( y=1583; y<=2000; y=y+1)  

79、for ( m=1; m<=12; m=m+1 )      printf( "%d ", zeller( (struct date)y,m,13 ) );C语言速成手册(四):指针、动态内存分配、标准输入 指针的定义定义一个指针的方法如下:类型名 *指针名;    例如,下面的语句定义了一个指针:int *pointer;    这样,pointer就是一个指针,它指向的是一个int类型的数据。   

80、; 一个指针可以是一个合法的内存地址,也可以为0(通常写成NULL)。    你可以用printf语句输出一个指针,对应的标识为"%p"。下面的代码可以输出上面定义的指针指向的地址。printf("%p",p);取地址与引用假如a是一个变量,p是一个指针,那么&a返回该变量的地址,*p返回该指针所指的内容(称做“引用”)。    阅读下面的代码片段:int *p;int a = 520;p = &a;printf( "%p -> %d

81、n", p, *p );*p = 1314;printf( "%p -> %dn", p, *p );printf( "a = %d", a );    程序输出如下。当执行了p=&a后,存取*p就相当于是存取变量a了。0022FF78 -> 5200022FF78 -> 1314a = 1314动态内存分配首先介绍sizeof函数(准确地说是一个运算符),它的参数为一个变量名或类型名,返回的是它所占内存空间的大小。下面的代码输出1 8 800 4 1 。long long a;

82、double b100;_Bool *c;printf( "%d " , sizeof(char) );printf( "%d " , sizeof(a) );printf( "%d " , sizeof(b) );printf( "%d " , sizeof(c) );printf( "%d " , sizeof(*c) );    下面介绍四种动态内存分配函数,使用它们前需要在程序最前面包含头文件stdlib.h。四种函数的格式分别为:void *ma

83、lloc ( size );void *calloc ( n, size );void free ( pointer );void *realloc( pointer, size );    函数malloc将在内存里寻找一个大小为size的连续空间,把分配到的内存地址作为一个指向void类型的指针(默认的无类型指针)返回。如果空间分配失败,函数返回NULL。    函数calloc将在内存里寻找一个大小为n * size的连续空间,并且把这段内存的数据全部清0,返回数据和malloc一样。如果空间分配失败,函数返

84、回NULL。    函数free用于释放内存空间,释放后的空间被回收,可以用于以后的malloc或calloc操作。    函数realloc在保证已有数据不变的情况下改变已有指针的空间大小,返回重新分得的空间的内存地址(有可能和原来不同)。如果空间重新分配失败,函数返回NULL。    Pascal中的new语句可以用前两个函数代替,free语句则相当于Pascal中的dispose。    注意,malloc和calloc函数所返回

85、的指针还没确定类型,理论上需要用类型转换。下面的程序合法地为p指针分配空间:int *p;p = (int *) malloc( sizeof(int) );*p = 520;    事实上,由于赋值时C语言自动转换类型,因此那个类型转换是没有必要的(去掉(int *)没有影响)。指针与结构一个指针可以指向一个结构,一个结构也可以包含一个指针。结构里包含一个指向结构的指针就构成了链表:struct node   int value;   struct node *next;   

86、60;这样,定义struct node *a,则(*a).next就是另一个指向node结构的指针。在C语言中,(*x).y的句型很常用,因此有一个专门的记号x->y来代替(*x).y这样繁杂的写法。    你可以从下面的程序中看到链表的使用。#include <stdio.h>#include <stdlib.h>    struct node   int value;   struct node *next;int main() &

87、#160;  struct node *head = NULL;    int i;    for(i=1;i<=10;i=i+1)                    struct node *newNode;      

88、0; newNode = malloc( sizeof(struct node) );        newNode->value = i;        newNode->next = head;        head = newNode;        

89、;    struct node *p = head;    while (p)            printf( "%dn", p->value );        p = p->next;        return 0;指针与函数前面说过,C语言中的函数参数和变量只能够供该函数使用。    下面四个程序代码的输出分别是什么?    代码一:#include <stdio.h>void swap( int a, int b )   int c = a;   a

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!