




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2页共41 页C 语言速成手册(零)序言、环境、你的第一个程序本文目的:介绍C 语言最基本的用法,能对付NOIp 就行本文特点:没有废话,不讲概念,只介绍语法适宜读者:已经学过其它语言,希望学习C 语言的人;特别适合熟练Pascal 并想转用C 语言的OIer编程环境:就我个人而言,Windows 下用Dev-C+,Linux 下用EmacsA+B 问题代码:#include intmain()int a, b;scanf(%d%d, &a, &b);printf(%d, a+b);return 0;第5页共41 页C 语言速成手册(一)基本数据类型、标准输出、函数语句和语句块和Pascal 一样,C 语言的每条语句以分号结尾。和Pascal 一样,单词和语句间的空格、回车符对编译没有影响。C 语言的语句块用花括号标识,也就是说字符 相当于Pascal 的begin,字符 相当于Pascal 的end; 。语句块中最后一条语句末尾的分号不能省略。如果语句块里只有一条语句,语句块的标识可以省略。这就好像Pascal 代码:for i:=1 to n dobeginwriteln(I Love You);end;里面的begin 和end 可以省略一样。注释的写法两种情形被认为是注释。符号/ 的后面(只限一行),以及符号/* 和*/ 之间(可以跨行)。例如:/* = THIS IS A COMMENT = */ This is a comment.常用数据类型C Pascalshort shortintint integerlong longintlong long int64unsigned short byteunsigned int wordunsigned long dwordunsigned long long qwordfloat realdouble doublechar char定义常量为了告诉编译器某个变量不会改变,你可以在变量定义前加一个const。例如,下面的语句定义了一个常数:const int maxn=2000;第6页共41 页定义变量定义变量使用这样的格式:类型名变量名1, 变量名2, . , 变量名n;变量名的命名规则与Pascal 相同:只能用大小写字母、数字或下划线,第一个字符不用数字。所不同的是,C语言中定义的名称要区分大小写。例如,下面的两条语句定义了三个整型变量和一个字符变量。int a,b,c;char ch;和Pascal 不同,变量的声明不一定要在整个代码前。你可以在程序中任意一个地方定义一个新的变量。定义的变量只能在当前函数(中的当前语句块)后面的代码中使用。也就是说,不同函数之间的变量不能混用,在某循环里定义的变量在循环外面是无效的。定义在函数外的变量将作为全局变量供后面的函数使用。基本数学运算作用C Pascal加+ +减- -乘* *除/ / 或div取余% mod除法的结果是整数还是小数取决于参与运算的数是整数还是小数。10 / 4 等于2,但写成10.0 / 4 或10 /4.0 就得2.5 了。关于字符类型C 语言中的字符用一对单引号 标注。例如,A表示字符A。无法打印或可能产生冲突的字符用反斜杠加一个字符来表示,这叫做转义符。常用转义符如下:n 换行t Taba 响铃 双引号 单引号? 问号 反斜杠因此,表示一个单引号,虽然它看上去像是两个字符。字符类型可以依照ASCII 码进行数学运算。例如,字符变量ch 可能被赋值为A+2(这样ch 就等于C),而0+1则等于a。第7页共41 页C 语言中的赋值和Pascal 不一样,C 语言的赋值只用一个等号,等号前没有冒号。声明变量时后面可以跟一个等号赋初始值。下面的语句都是合法的:int a=3, b=106, c=a+b, d;char ch = c - 0;d = a * b;类型转换与“名词动用”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;d = a / b;e = (double) a / b;这段代码中,a 最终被赋值为122,b 得到的值是20,而c 的值则为字符0;d 获得的值为6.0,而e 的值是6.1 。标准输出输出使用printf 函数。printf 函数的使用方法如下:printf (字符串, 待输出表达式1, 待输出表达式2, . , 待输出表达式n );C 语言的字符串用一对双引号 注明,里面允许有转义符。printf 将把字符串输出到屏幕上。字符串中可以有若干个标识,这些标识帮后面待输出的内容“占一个位置”。常用的标识格式为%x.y(c|d|f|e),其中x表示输出占的宽度,y 表示保留位数;c,d,e,f 四个字母表示输出类型,你需要选择一个。c 表示输出字符,d(也可以用i )表示输出整数,f 表示输出小数,e 用科学计数法表示小数。printf 后面的参数依次“填入”这些标识。注意d 和e,f 不能混用,也就是说,你不能把一个小数输出成整数格式,或把整数输出成小数格式(除非事先转了类型)。特别地,%表示输出一个百分号。观察下列代码片段第8页共41 页printf (Welcome to M n);printf ( 4 + 5 = %dnand 4 - 5 = %dnn, 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 = %cnn, a );double b = 7;printf ( 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, 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 * a = 00204a = fa / b = 14.571429a / b = 1.457143e+001a / b = 14.571428571a / b = 14.571a / b = 14.571b / a = 6.863%第9页共41 页c = Ac = Ac = 65M函数的定义、返回和调用定义一个函数的格式如下:函数返回类型函数名( 参数类型1 参数名1, 参数类型2 参数名2, . , 参数类型n 参数名n )函数内容如果某个函数不返回任何数据(相当于Pascal 中的“过程”),函数返回类型要写成void。如果不写返回类型,函数默认返回类型为int。如果某个函数不带任何参数,参数表一般留空(也可以用一个void 代替)。为了强调某个参数在整个函数中始终不变,类型前可以标明const。函数的返回使用下面的语句:return 表达式;执行这条语句将立即终止该函数的运行。下面定义的一个函数可以返回三个数的平均值:double average (double a , double b , double c)double sum=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 = average( 2, 6.5, 4.23 );第10页共41 页有一点不同的是,当所调用的函数不带参数时仍然要写括号,例如:void writeMessage()printf(Welcome to M);void output()writeMessage();C 语言同样支持递归调用。由于C 语言也只能调用前面定义过的函数,因此C 同样需要类似于向前引用的方法。具体方法是把需要提前引用的函数的第一行复制一份提到前面去。下面的两种做法都是正确的,其中第一种方法允许在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 (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 , double );C 语言中也允许在函数中定义子函数(函数的嵌套)。标准的C 语言不支持在函数中定义子函数(函数的嵌套),虽然某些编译器可能支持。第11页共41 页一个完整的程序代码的构成代码前几行用于包含头文件,每行包含一个,格式如下:#include 常用的头文件有stdlib.h, stdio.h, string.h, math.h 等等,分别提供一些常用函数、输入输出函数、字符串函数和数学相关函数。注意我们之前用的printf 函数是属于stdio.h 里的,因此要使用该函数必须在代码最开头加入#include 。接下来是若干个函数。这些函数里必须有一个名为main 的函数,它返回的值是一个int 类型,代表程序的退出代码(0=正常退出)。程序会自动寻找这个函数作为主函数执行。下面的代码是一个完整的C 程序代码,这是我们的第一个完整的程序代码:#include double average (double a , double b , double c)double 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;第12页共41 页C 语言速成手册(二)布尔值、条件判断、循环逻辑运算符作用C Pascal等于= =不等于!= 小于 小于等于= = =且& and或| or非! notC 语言的if 语句C 语言中if 语句的写法如下:if (表达式)表达式为真时执行的内容之前说过,如果执行的内容只有一句话,花括号可以省略。下面的语句将返回整数a 的绝对值:if ( ab )int c=a;a=b;b=c;第13页共41 页C 语言中也有else if 和else 的用法,但和Pascal 不同的是else 的前一条语句末要保留分号。下面的语句用于判断三边长分别为a, b, c 的三角形是什么三角形:if ( a+bc & b+ca & a+cb )if ( a=b & b=c )printf(Regular Triangle);else if ( a=b | b=c | a=c )printf(Isosceles Triangle);elseprintf(Scalene Triangle); elseprintf(Triangle Doesnt Exist.);C 语言的bool 类型C 语言中没有布尔类型。任何一个整型的变量都可以充当布尔变量,用0 表示False,其它数(默认为1)表示True。观察下列代码片断。printf(%d n, 3+5 = 8);inta;a = 3+5=9;printf(%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);第14页共41 页这段程序的输出为:101ais 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 或false。例如:boola = true;if (a) printf(a is true);下面是两个完整的程序。第一个程序中_Bool 可以替换成int。三种写法都正确,你可以选择一种自己喜欢的写法。#include _Bool isNegative ( int a )if (a0) return 1;else return 0; intmain()if ( isNegative(-100) )printf(-100 is Negative);return 0;#include #include boolisNegative ( int a )if (a0) return true;else return false; intmain()if ( isNegative(-100) )第15页共41 页printf(-100 is Negative);return 0;C 语言的for 循环for 循环使用下面的语句:for ( 语句1; 语句2; 语句3 )循环内容其中语句1 用于初始化,若语句2 为真(非0)则进入循环;每次循环后将执行语句3,此时若仍然满足语句2 则继续循环,否则退出。语句123 中,某一种语句可能为空,也可能由多条语句组成(多条语句用逗号隔开)。下面的语句打印1 到10 这10 个数。以下所有写法都是正确的。通常用第一种写法。inti;for (i=1; i=10; i=i+1)printf(%dn, i );inti=1;for ( ; i=10; i=i+1)printf(%dn, i );inti;for (i=1; i=10; )printf(%dn, i );i=i+1;inti;for (i=1; i1; d=d+1 )for ( ; n%d=0; count=count+1, n=n/d );return count;下面的语句将产生死循环:for ( ; ; ) ;第16页共41 页C 语言的while 循环while 循环格式如下:while ( 循环条件)循环内容下面的代码计算1394 和6150 的最大公约数:inta=1394, b=6150;while ( b )int tmp = a % b;a = b;b = tmp;printf(The gcd is %d, a);do.while 循环do.while 循环的格式如下:do循环内容while ( 循环条件);将条件放在循环内容的后面,使程序至少执行循环内容一次。循环控制C 语言中使用break 语句和continue 语句来控制循环,其使用方法与Pascal 完全一样。switch 语句switch 语句相当于Pascal 中的case 语句。下面代码的输出为2 3 default done! , 因为switch 语句只负责把程序运行的位置跳转到相应的地方。intn=2;switch (n)case 1: printf(1 );case 2: printf(2 );case 3: printf(3 );default: printf(default ); printf(done!);第17页共41 页你可以用break 语句实现Pascal 的case,例如下面的写法就可以让程序输出2 done! :intn=2;switch (n)case 1:printf(1 );break;case 2:printf(2 );break;case 3:printf(3 );break;default: printf(default );printf(done!);goto 语句你可以在程序的任何位置插入一个标签:标签名:并在同一函数里使用下面的语句实现无条件跳转:goto 标签名;例如,下面的代码将产生死循环,并输出满屏幕的求爱信息。a: printf( I Love You ! );gotoa;第18页共41 页C 语言速成手册(三)数组、字符串、结构一维数组的定义、初始化和使用定义一个一维数组的格式如下:类型数组名数组大小;数组的下标范围总是从0 开始(因此下标最大为数组大小减一)。下面一行语句定义了一个大小为10 的长整型数组:long value10;这相当于下面的Pascal 语句:var value:array0.9of longint;C 语言的数组范围左端点不能自定义,它的数组下标只能从0 开始。下面几种方式可以在定义数组的同时进行初始化:long value10 = 0, 8, 2, 0, 3 ;long value10 = 1=8, 2=2, 4=3 ;上面两个语句是等价的。其中前一种方法依次对数组的前5 个数进行初始赋值,后一种方法仅对数组的其中三个位置进行初始化。初始化中没有涉及到的下标所对应的数值自动被设为0。C 语言允许数组的大小为一个变量,但这样的数组在定义时不能像上面一样进行初始化。这种初始化方法只在定义数组时用,不能用于程序中的赋值。数组之间也不能直接赋值,你不能把数组a 整个赋值给数组b。程序中使用数组的方法和Pascal 一样。下面的程序将输出1000 以内的素数:#include #include int main()bool isPrime1000;int i,j;for(i=2;i1000;i=i+1)isPrimei=true;for(i=2;i1000;i=i+1)if (isPrimei)printf(%d ,i);for(j=2*i;j1000;j=j+i)isPrimej=false;第19页共41 页return 0;当一维数组作为函数参数时,数组大小可以不写,以适应不同长度的数组。通常你还需要另一个参数告诉函数你的数组有多大。下面这个函数返回数组中的最大值:long maxValue ( long length, long array )long i, max = 0;for ( i=0; imax) max = arrayi;return max;下面的代码合法地调用了上面的函数。long 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 开始的。观察下列代码:int i;char a20=;for (i=0;i20;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 116 114 105 120 54 55 46 99 111 109 0 0 0 0 0 0 0 0t= 或+ 等运算符对字符串无效。第20页共41 页下面的函数返回字符串的字符数:int stringLength( char a )int count=0;while ( acount )count=count+1;return count;赋值时,如果字符串太长了,有两种方法可以让你分行写。一是在行末加一个反斜杠表示和下一行相连,二是每一行都用双引号注明(编译器会自动把它连接起来)。下面两个代码是等价的。注意第一个代码中的第二行必须顶格写,否则第二行前面的空格也要算进字符串里。char blogTitle100=Matrix67: My Blog - 50% Informatics, 50% Mathematics, and 50% Imagination;char blogTitle100=Matrix67: My Blog - 50% Informatics, 50% Mathematics, and 50% Imagination;和数组一样,对字符串的赋值只能在定义时使用,程序中不能这样做。多维数组的定义、初始化和使用定义一个多维数组的格式如下:类型数组名大小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 ;这还可以直接写成: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。当多维数组作为函数的参数时,只有第一维的大小可以不写。因此,下面的三个函数中前两个是合法的,第三个是不合法的。long function_1( int m, int n, long a2020 );long function_2( int m, int n, long a20 );第21页共41 页long function_3( int m, int n, long a );为了让参数仍然适用于各种大小的数组,C 语言允许这样定义函数:long function_4( int m, int n, longmn );例如,下面的函数递归地计算行列式:long determinant( int n, long ann )if (n=1) return(a00);int i,j,k;long ans = 0;long subn-1n-1;for ( i=0; in; i=i+1 )for ( j=1; jn; j=j+1 )for ( k=0; ki; k=k+1 )subj-1k=ajk;for ( k=i+1; kn; k=k+1 )subj-1k-1=ajk;ans = ans + (1-i%2*2)*a0i*determinant(n-1, sub);return ans;下面的代码片段正确地调用了上面的函数:long a44= 1, 4, -1, 4 , 2, 1, 4, 3 , 4, 2, 3, 11 , 3, 0, 9, 2 ;printf( %d , determinant(4,a) );结构的定义、初始化和使用Pascal 中的记录类型在C 语言中叫做“结构”。定义一个结构的方式如下:struct 结构名在此定义若干变量(域);第22页共41 页注意花括号后面需要有一个分号。下面定义一个date 结构:struct dateint year;short month,day;这样你就获得了一个名为struct date 的类型名。和变量的定义一样,一个结构的定义只能供当前函数(的当前语句块)中后面的部分使用。因此通常把结构的定义放在所有函数的前面作为一个全局的定义。之后,你便可以写这样的语句:struct date today;结构的使用方法同Pascal 的记录类型一样。例如,下面的函数用于计算某一天是星期几(Zeller 公式):int zeller( struct date t )if (t.month0) return ans;else return ans+7;给一个结构赋初始值和数组的初始化差不多。下面两个语句是等价的:struct date myBirthday = 1988, 5, 16 ;struct date myBirthday = .year=1988, .month=5, .day=16 ;这种方法也可以用于程序中的赋值操作,但需要加上一个类型转换(见这里的“名词动用”一节)。例如,下面三个代码片段都是等价的:myBirthday.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)for ( m=1; m %dn, 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;double b100;_Bool *c;printf( %d , sizeof(char) );printf( %d , sizeof(a) );printf( %d , sizeof(b) );printf( %d , sizeof(c) );printf( %d , sizeof(*c) );第24页共41 页下面介绍四种动态内存分配函数,使用它们前需要在程序最前面包含头文件stdlib.h。四种函数的格式分别为:void *malloc ( size );void *calloc ( n, size );void free ( pointer );void *realloc( pointer, size );函数malloc 将在内存里寻找一个大小为size 的连续空间,把分配到的内存地址作为一个指向void 类型的指针(默认的无类型指针)返回。如果空间分配失败,函数返回NULL。函数calloc 将在内存里寻找一个大小为n * size 的连续空间,并且把这段内存的数据全部清0,返回数据和malloc 一样。如果空间分配失败,函数返回NULL。函数free 用于释放内存空间,释放后的空间被回收,可以用于以后的malloc 或calloc 操作。函数realloc 在保证已有数据不变的情况下改变已有指针的空间大小,返回重新分得的空间的内存地址(有可能和原来不同)。如果空间重新分配失败,函数返回NULL。Pascal 中的new 语句可以用前两个函数代替,free 语句则相当于Pascal 中的dispose。注意,malloc 和calloc 函数所返回的指针还没确定类型,理论上需要用类型转换。下面的程序合法地为p指针分配空间:int*p;p = (int *) malloc( sizeof(int) );*p = 520;事实上,由于赋值时C 语言自动转换类型,因此那个类型转换是没有必要的(去掉(int *)没有影响)。指针与结构一个指针可以指向一个结构,一个结构也可以包含一个指针。结构里包含一个指向结构的指针就构成了链表:structnodeint value;struct node *next;这样,定义struct node *a,则(*a).next 就是另一个指向node 结构的指针。在C 语言中,(*x).y的句型很常用,因此有一个专门的记号x-y 来代替(*x).y 这样繁杂的写法。你可以从下面的程序中看到链表的使用。#include #include structnodeint value;struct node *next;第25页共41 页intmain()struct node *head = NULL;int i;for(i=1;ivalue = i;newNode-next = head;head = newNode;struct node *p = head;while (p)printf( %dn, p-value );p = p-next;return 0;指针与函数前面说过,C 语言中的函数参数和变量只能够供该函数使用。下面四个程序代码的输出分别是什么?代码一:#include void swap( int a, int b )int c = a;a = b;b = c;intmain()int a = 520, b = 1314;swap( a , b );printf( %d %d, a, b );return 0;第26页共41 页代码二:#include inta = 520, b = 1314;void swap( int a, int b )int c = a;a = b;b = c;intmain()swap( a , b );printf( %d %d, a, b );return 0;代码三:#include inta = 520, b = 1314;void swap()int c = a;a = b;b = c;intmain()swap();printf( %d %d, a, b );return 0;代码四:#include void swap( int *a, int *b )int c = *a;*a = *b;*b = c;第27页共41 页intmain()int a = 520, b = 1314;swap( &a, &b);printf( %d %d, a, b );return 0;答案:前两个程序输出520 1314,后两个程序输出1314 520。前两个程序中,待交换的两个数(即使是全局变量)作为参数传给了swap 函数,该函数里的操作对函数外无影响。第三个程序中,swap 函数对全局变量直接进行操作,其影响是全局的。最后一个程序巧妙地应用了指针来实现两数交换。函数的参数是指针类型,这个函数不能改变指针本身,但可以改变指针所指的内容。这是写此类函数通常所用的方法。为了强调函数void swap( int *a, int *b )中的指针本身不发生改变,很多地方喜欢写成void swap(const int *a, const int *b ) 。指针与数组数组由内存的连续空间构成,因此可以用指针来访问。事实上,数组名本身就是一个指针。观察下列代码:inta100;printf(%pn, &a0);printf(%pn, a);printf(%dn, a = &a0 );printf(%pn, &a1);printf(%pn, a+1);看看输出结果(自己运行),你会发现,数组名其实就是一个指向数组起始位置的指针,其作用相当于&a0。而指针本身可以进行加减运算(表示内存地址的加减,具体加多少减多少取决于指针所指的类型),其本质是在数组中进行定位。因此,下面的两个代码是完全等价的:inti, a100;for ( i=0; i100; i=i+1 ) *(a+i)=i;inti, a100;for ( i=0; i100; i=i+1 ) ai=i;下面的程序输出0 1 2 3 4 0。函数init 不能改变变量的值,但由于数组的实质是指针,因此它可以改变数组所储存的内容。#include void init( int a5, int b )int i;for ( i=0; i5; i=i+1 ) ai=i;b = 5;第28页共41 页intmain()int i, a5, b=0;init( a, b );for ( i=0; i5; i=i+1 ) printf(%d ,ai);printf( %dn, b );return 0;你甚至可以用指针来创建数组。使用函数calloc 可以方便地得到指定长度并已全部初始化为0 的数组。再加上realloc 函数后,你就可以实现
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保证协议书怎么写
- 关于钱的协议书
- 森林灾害应急物资储备与调配中心创新创业项目商业计划书
- 海水养殖废弃物资源化利用创新创业项目商业计划书
- 小麦区块链追溯平台创新创业项目商业计划书
- 数字艺术品制作创新创业项目商业计划书
- 食品安全学综合题库及答案解析
- 大豆国际科研合作创新创业项目商业计划书
- 2025年眼科常见眼病诊断与治疗模拟考察卷答案及解析
- 平邑从业资格证考试地址及答案解析
- 高中化学鲁科版必修第一册第一章认识化学科学第二节研究物质性质的方法和程序课时练习
- 2024版人教版英语初一上单词默写表
- 双下肢乏力护理查房
- 医保飞行检查培训课件
- 工程结算审核服务方案技术标
- 公司驾驶业务外包管理办法
- 店中店合作协议
- AKAIEWI5000电吹管快速入门(中文说明书)
- 炉外精炼-RH读本
- 部编版语文小学五年级下册第一单元集体备课(教材解读)
- 模具设计与制造授课全张课件
评论
0/150
提交评论