《C语言复习及C基础知识.ppt》由会员分享,可在线阅读,更多相关《C语言复习及C基础知识.ppt(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第二章第二章 C语言复习及语言复习及C+基础知识基础知识2.1.1 C+的起源的起源2.1.2 C+的特点的特点*.c C的源程序的源程序 以下的文件以下的文件C和和C+都可用:都可用:*.h C的的头包含文件头包含文件 *.cpp C+的源程序的源程序*.hpp C+的的头包含文件头包含文件 /*/C的注释的注释/C+的注释的注释2.1 C+的起源和特点的起源和特点12.2 C+源程序的构成源程序的构成2.2.1 C+程序的一般格式程序的一般格式例例2.1 说明说明C+构造的示例程序构造的示例程序#include /系统头文件系统头文件int add(int a,int b);/函数原型的说
2、明函数原型的说明int main()/主函数主函数 int x,y,sum;/定义三个整型变量定义三个整型变量 cout输入二个数输入二个数:x;/从键盘输入变量从键盘输入变量x的值的值 ciny;/从键盘输入变量从键盘输入变量y的值的值 sum=add(x,y);/调用函数调用函数add,将函数返回值赋给变量将函数返回值赋给变量sum cout二数和是二数和是:sumn;/输出输出 return 0;int add(int a,int b)/定义函数定义函数add,函数函数(返回返回)值为整型值为整型 int c;/定义临时变量定义临时变量c c=a+b;/求和求和 return c;/将将
3、c的值返回的值返回,通过通过add带回调用处带回调用处22.2.2 C+程序的结构特性程序的结构特性1.包含文件及头文件包含文件及头文件2.标准输入与输出标准输入与输出 printf(格式说明格式说明,表达式表列表达式表列);scanf(格式说明格式说明,地址表列地址表列);cout3.新行新行 “n”endl4.主函数主函数 void main().5.一般的函数一般的函数 函数头函数头 int add (int a,int b)函数体函数体 int c;/变量定义变量定义 c=a+b;/执行部分执行部分 return c;36.面向对象的特性面向对象的特性 类的声明部分类的声明部分 类的使
4、用部分类的使用部分例例2.2#include/类的声明部分类的声明部分class A int x,y,z;/类类A的数据成员声明的数据成员声明 fun()/类类A的成员函数声明的成员函数声明 ;/类的使用部分类的使用部分void main()A a;/创建一个类创建一个类A的对象的对象a .a.fun();/给对象给对象a发消息,调用成员函数发消息,调用成员函数fun()2.3 C+在非面向对象方面的一些特性在非面向对象方面的一些特性2.3.1 注释行注释行/*/C的注释的注释/C+的注释的注释2.3.2 新的新的I/O流流cin是标准输入流,在程序中代表标准输入设备,即键盘。是标准输入流,在
5、程序中代表标准输入设备,即键盘。运算符运算符“”表示向右表示向右cout是标准输出流,在程序中代表标准输出设备,即屏幕。是标准输出流,在程序中代表标准输出设备,即屏幕。运算符运算符“”表示向左表示向左使用使用cin或或cout进行进行I/O操作时,在程序中必须嵌入头文件操作时,在程序中必须嵌入头文件iostream.h/例例2.3#include int main()char name20;coutname;coutnameendl;return 0;/例例2.4#include void main()int x=25;couthexxdecxoctx=0;k-).以上的写法在以上的写法在C程
6、序中都是错误的,但在程序中都是错误的,但在C+程序中都是正确的。程序中都是正确的。52.3.4 结构、联合和枚举名可直接作为类型名结构、联合和枚举名可直接作为类型名定义枚举类型名:定义枚举类型名:enum bool FALSE,TRUE;定义结构枚举类型名:定义结构枚举类型名:Struct student int sno;char*sneme;C语言中定义枚举类型变量:语言中定义枚举类型变量:enum bool done;定义结构类型变量:定义结构类型变量:struct student s1,s2;C+语言中定义枚举类型变量:语言中定义枚举类型变量:bool done;定义结构类型变量:定义结
7、构类型变量:student s1,s2;62.3.5 const修饰符修饰符#define LIMIT 100这里这里 LIMIT 是一个标志,代表是一个标志,代表 100const int LIMIT=100;这里这里 LIMIT 是一个常量名,在内存有空间放了是一个常量名,在内存有空间放了100,因此有地址,因此有地址,可以用指针指向这空间,但不能修改它。可以用指针指向这空间,但不能修改它。int i=100;这里这里 i 是一个变量名,在内存有空间放了是一个变量名,在内存有空间放了100,因此有地址,可以用,因此有地址,可以用指针指向这空间,且可以改放别的整数。指针指向这空间,且可以改放
8、别的整数。(1)可以用一个指向常量的指针变量指向常量:可以用一个指向常量的指针变量指向常量:const char*name=“chen”;name3=a;/错误错误 name=“zhang”;/正确正确(2)指针常量指针常量 char*const name=“chen”;name3=a;/正确正确 name=“zhang”;/错误错误(3)const char*const name=“chen”;namechen常量常量zhang常量常量nXanamechenzhang常量常量an aX7/例例2.5#include main()int a=1;#define T1 a+a#define T2
9、 T1-T1 coutT2 is T2endl;return 0;cout“T2 is“a+a-a+aendl;/例例2.6#include main()int a=1;const T1=a+a;const T2=T1-T1;coutT2 is T2endl;return 0;T2a+aa+aT1-T182.3.6 内置函数内置函数/例例2.7#include int main()3次次 for(int i=1;i=3;i+)coutr=i area=circle(i)endl;return 0;在函数前加以在函数前加以 inline,成为内置函数成为内置函数#include int main
10、()代码嵌入代码嵌入 for(int i=1;i=3;i+)coutr=i area=circle(i)endl;return 0;float circle(float r)return 3.1416*r*r;inline float circle(float r)return 3.1416*r*r;9/例例2.8#include#define doub(x)x*2int main()for(int i=1;i=3;i+)couti doubled is doub(i)endl;cout1+2 doubled is doub(1+2)endl;return 0;/例例2.9#include i
11、nline int doub(int x)return x*2;int main()for(int i=1;i=3;i+)couti doubled is doub(i)endl;cout1+2 doubled is doub(1+2)endl;return 0;102.3.7 函数原型函数原型返回类型返回类型 函数名(参数表)函数名(参数表);/例例2.10#include void write(char*s);/函数原型或叫函数声明函数原型或叫函数声明 void main()write(Hello,world!);void write(char*s)无分号无分号 coutsendl;使用在
12、前,定义在后,要先声明。使用在前,定义在后,要先声明。若定义在前,使用在后,就可不必声明。若定义在前,使用在后,就可不必声明。说明说明:(1)-(8)112.3.8 带有缺省参数的函数带有缺省参数的函数C+在说明函数原型时,可以为一个或多个参数指定缺省参数值,在说明函数原型时,可以为一个或多个参数指定缺省参数值,以后调用此函数时,若省略其中某一实参,以后调用此函数时,若省略其中某一实参,C+自动以缺省值作为自动以缺省值作为相应參数的值。相应參数的值。int special(int x=5,float y=5.3);合法的调用;合法的调用;special();special(25);specia
13、l(100,79.8);说明说明:(1)所有取缺省值参数都必须出现在不取缺省值参数的右边。所有取缺省值参数都必须出现在不取缺省值参数的右边。int fun(int i,int j=5,int k)是错误的是错误的 int fun(int i,int k,int j=5)是正确的是正确的(2)调用时,若某个参数省略,则其后的参数皆应省略。调用时,若某个参数省略,则其后的参数皆应省略。不合法的调用;不合法的调用;special(,21.5);122.3.9 函数重载函数重载C+中,只要函数的參数的类型不同,或者參数个数不同,或者二中,只要函数的參数的类型不同,或者參数个数不同,或者二兼有之,几个函
14、数可以用相同的函数名。称为函数重载兼有之,几个函数可以用相同的函数名。称为函数重载/*例例2.11#include int square(int i)return i*i;float square(float f)return f*f;double square(double d)return d*d;void main()int i=12;float f=3.4;double d=5.67;couti*i=square(i)endl;coutf*f=square(f)endl;coutd*d=square(d)endl;13/*例例2.12#include int mul(int x,int
15、 y)return x*y;int mul(int x,int y,int z)return x*y*z;void main()int a=3,b=4,c=5;couta*b=mul(a,b)endl;couta*b*c=mul(a,b,c)endl;说明:说明:(1)重载函数应在参数个数或参数类型上有所不同,编译才能识别重载函数应在参数个数或参数类型上有所不同,编译才能识别调用哪一个重载版本,即使返回类型不同也不行。调用哪一个重载版本,即使返回类型不同也不行。如:如:int mul(int x,int y);和和 double mul(int x,int y);是不能重载的。是不能重载的。(
16、2)一般而言,重载函数应对不同的参数情况执行相同的功能。一般而言,重载函数应对不同的参数情况执行相同的功能。如:如:abs(int x);和和 abs(float x);都是求绝对值,一个是整数的绝对值,都是求绝对值,一个是整数的绝对值,一个是实数的。一个是实数的。14(3)函数的重载与带默认值的函数一起使用时,有可能引起二义性函数的重载与带默认值的函数一起使用时,有可能引起二义性如:如:void Drawcircle(int r=0;int x=0;int y=0);void Drawcircle(int r);当调用:当调用:Drawcircle(20);编译程序无法确定用哪一个函数。编译
17、程序无法确定用哪一个函数。(4)在函数调用时,当实参与形参类型不相符,在函数调用时,当实参与形参类型不相符,C+会自动做类型会自动做类型转换,但有时也可能产生错误:转换,但有时也可能产生错误:void f_a(int x);void f_a(long x);int c=f_a(5.56);?2.3.10 作用域运算符作用域运算符:当全局变量和局部变量同名时,函数中不能使用全局变量。当全局变量和局部变量同名时,函数中不能使用全局变量。/*例例2.13#include int avar=10;/全局变量全局变量void main()int avar=25;/局部变量局部变量 coutavar is
18、 avarendl;局部变量局部变量可用作用域运算符可用作用域运算符 :/*例例2.13#include int avar;void main()int avar;avar=25;/局部变量局部变量avar :avar=10;/全局变量全局变量avar coutlocal avar=avarendl;coutglobal avar=:avarendl;152.3.11 无名联合无名联合C语言的共用体:语言的共用体:union data int i;char ch;float f;union data a,b,c;引用:引用:a.i a.ch a.f 等等C+的无名联合:的无名联合:union
19、int i;char ch;float f;直接可用直接可用 i ch f 等等16a4字节字节ichf2.3.12 强制类型转换强制类型转换C语言的强制类型转换:语言的强制类型转换:int i=10;float x=(float)i;C+的强制类型转换:的强制类型转换:int i=10;float x=float(i);float y=(float)i;两种方法两种方法C+都可以。都可以。172.3.13 new和和delete C语言用函数语言用函数malloc()和和free()动态分配内存和释放动态分配的动态分配内存和释放动态分配的内存。内存。C+使用运算符使用运算符new和和dele
20、te能更好、更简单地进行内存的分能更好、更简单地进行内存的分配和释放。配和释放。如如C语言中用:语言中用:int*p;p=(int*)malloc(sizeof(int);*p=10;而而C+语言中语言中 /*2.14#include void main()int*p;/定义一个整型指针变量定义一个整型指针变量p p=new int;/动态分配一个整型存储区动态分配一个整型存储区,并把首地址赋给并把首地址赋给p *p=10;cout*pendl;delete p;/释放释放p指的空间指的空间,撤消指针撤消指针pnew 和和 delete 的优点:的优点:(1)new可以自动计算所要分配内存的类
21、型的大小,而不必用可以自动计算所要分配内存的类型的大小,而不必用sizeof来来计算。计算。p18(2)new能够自动返回正确的指针类型,而不必进行类型转换。能够自动返回正确的指针类型,而不必进行类型转换。(3)可以用可以用new将分配的对象初始化。将分配的对象初始化。(4)new 和和 delete 都可以被重载,允许建立自定义的分配系统。都可以被重载,允许建立自定义的分配系统。说明:说明:(1)使用使用new可以为数组动态分配内存空间(但不能赋初值)。可以为数组动态分配内存空间(但不能赋初值)。int*pi=new int10;int*pi=new int234;(2)new可在为简单变量
22、分配内存空间的同时,进行初始化。可在为简单变量分配内存空间的同时,进行初始化。/*例例2.16#include void main()int*p;p=new int(99);/动态分配内存动态分配内存,并将并将99作为初始值赋给它作为初始值赋给它 cout*pendl;delete p;(3)释放动态分配的数组存储区:释放动态分配的数组存储区:delete p;19(4)使用动态分配内存时,分配失败,将返回空指针(使用动态分配内存时,分配失败,将返回空指针(NULL)。)。因此通常要对内存的动态分配是否成功进行检查。因此通常要对内存的动态分配是否成功进行检查。分配内存失败,分配内存失败,p=N
23、ULL/*例例2.17#include void main()int*p;p=new int;if(!p)/若分配内存失败若分配内存失败 coutallocation failuren;return;*p=20;cout*pendl;delete p;(5)用用new分配的空间,使用结束后应用分配的空间,使用结束后应用delete显式地释放。显式地释放。p NULL202.3.14 引用引用引用可为变量起别名,主要有变量的引用、函数參数的引用、函数引用可为变量起别名,主要有变量的引用、函数參数的引用、函数返回值的引用。返回值的引用。1.引用变量引用变量 数据类型数据类型&别名别名=已定义的变量
24、名;已定义的变量名;/*例例2.18#include void main()int i;int&j=i;/i 又叫又叫 j i i=30;j couti=ij=jn;j=80;couti=ij=jn;cout“Address of i”&i“n”;/显示显示 i 的地址的地址 coutAddress of j&jn;(1)定义引用时,必须立即对它进行初始化,不能以后再赋值。定义引用时,必须立即对它进行初始化,不能以后再赋值。int i;int&j;/错误错误 j=i;21(2)引用实际上是一种隐式指针,可以少用引用实际上是一种隐式指针,可以少用 “*”号号 /*例例2.19#include v
25、oid main()int i=15;/整型变量整型变量i int*iptr=&i;/iptr指向指向i int&rptr=i;/rptr引用引用i couti is iendl;cout*iptr is*iptrendl;coutrptr is rptrendl;i=29;cout After changing i to 29endl;couti is iendl;cout*iptr is*iptrendl;coutrptr is rptrendl;i is 15 i is 29*iptr is 15 *iptr is 29rptr is 15 rptr is 29iptrirptr22(3
26、)引用不可重新赋值,不可使其作为另一个变量的别名。引用不可重新赋值,不可使其作为另一个变量的别名。int i,k;int&j=i;j=&k;/错误错误(4)并不是任何类型的数据都可引:并不是任何类型的数据都可引:int&a10;/不能建立引用数组不能建立引用数组int&*p;/不能建立指向引用的指针不能建立指向引用的指针int&r;/不能建立引用的引用不能建立引用的引用(5)当使用取地址运算符时当使用取地址运算符时&,取的是被引用变量的地址。,取的是被引用变量的地址。int num=50;int&ref=num;int *p=&ref;则则p中保存的是变量中保存的是变量num的地址。的地址。(
27、6)引用符虽然与地址符一样,但不会引起二义性。引用符虽然与地址符一样,但不会引起二义性。2.引用作为函数參数引用作为函数參数引用參数的方法可以代替引用參数的方法可以代替C语言中的指针地址调用的方式。语言中的指针地址调用的方式。23/*例例2.20 C语言中的指针地址调用的方式语言中的指针地址调用的方式#include void swap(int*m,int*n)int temp;temp=*m;*m=*n;*n=temp;void main()int a=5,b=10;couta=a b=bendl;swap(&a,&b);couta=a b=bendl;a=5 b=10a=10 b=524m
28、&aatemn&bb/*例例2.21 引用參数的方法引用參数的方法#include void swap(int&m,int&n)int temp;temp=m;m=n;n=temp;main()int a=5,b=10;couta=a b=bendl;swap(a,b);couta=a b=bendl;return 0;a=5 b=10a=10 b=525 matem nb3.引用返回值引用返回值函数可返回一个引用,其目的是可将函数用在赋值运算符的左边。函数可返回一个引用,其目的是可将函数用在赋值运算符的左边。/*例例2.22#include int a=1,3,5,7,9;int&index
29、(int);/声明返回引用的函数声明返回引用的函数void main()index(2)=25;/将将a2重新赋值为重新赋值为25 coutindex(2)endl;int&index(int i)return ai;264.引用举例引用举例例例2.23 /引用参数和引用返回值引用参数和引用返回值#include int&max(int&num1,int&num2);int&min(int&num1,int&num2);main()int num1,num2;coutnum1;coutnum2;max(num1,num2)=0;coutn把大的数置成把大的数置成 0 后后,这两个数是这两个数是
30、:;coutnnum1 和和 num2n;coutn再一次输入二个数再一次输入二个数:n;coutnum1;coutnum2;27 min(num1,num2)=0;coutn把小的数置成把小的数置成 0 后后,这两个数是这两个数是:;coutnnum1 和和 num2num2)?num1:num2;int&min(int&num1,int&num2)/两数中找小数两数中找小数 return(num1num2)?num1:num2;运行结果:运行结果:输入第一个数输入第一个数:45输入第二个数输入第二个数:78把大的数置成把大的数置成 0 后后,这两个数是这两个数是:45 和和 0 再一次输入
31、二个数再一次输入二个数:输入第一个数输入第一个数:13输入第二个数输入第二个数:56把小的数置成把小的数置成 0 后后,这两个数是这两个数是:0 和和 5628 2.3.15 void 指针指针void 型指针是一通用型指针,可指任何类型:型指针是一通用型指针,可指任何类型:void pa;/错误,不能声明错误,不能声明void类型的变量类型的变量void *pa;/正确,可以声明正确,可以声明void类型的指针类型的指针 int i=456;char c=a;pc=&i;pc=&c;例例2.24#include void main()void *pc;int i=456;char c=a;p
32、c=&i;cout*(int*)pcendl;pc=&c;cout*(char*)pcendl;以下部分是以下部分是C语言复习参考语言复习参考2.4 存储类存储类存储类存储类 类型修饰符类型修饰符 类型类型 变量名表列变量名表列;存储类存储类 auto static extern register 类型修饰符类型修饰符 const volatile2.4.1 自动变量和寄存器变量自动变量和寄存器变量2.4.2 静态变量静态变量2.4.3 外部变量外部变量292.5 基本运算符和表达式基本运算符和表达式2.5.1 关系运算符关系运算符2.5.2 算术运算符算术运算符2.5.3 逻辑运算符逻辑运算
33、符2.5.4 位运算符位运算符2.5.5 条件运算符条件运算符2.5.6 逗号表达式逗号表达式2.5.7sizeof运算符运算符2.6赋值及运算顺序赋值及运算顺序2.7 类型转换类型转换302.8 语句语句2.8.1 表达式语句、空语句和块语句表达式语句、空语句和块语句2.8.2 选择语句选择语句 1.if 语句语句 2.switch 语句语句2.8.3 循环循环 1.while 语句语句 2.do while 语句语句 3.for 语句语句2.8.4 转移转移 1.break 与与 continue 语句语句 2.goto 语句语句2.8.5 return 语句语句312.9 函数函数2.9
34、.1 函数的基础知识函数的基础知识 函数先声明再调用后定义的例子函数先声明再调用后定义的例子#include void main()int a,b,c;int sum(int,int);/先申明先申明sum()函数函数 a=25;b=36;c=sum(a,b);/调用调用sum()函数函数 cout c endl;int sum(int x,int y)/定义定义sum()函数函数 int temp;temp=x+y;return temp;32/习题习题 函数函数(7.1)#include void main()int m,n,l,s;int maxj(int a,int b);int mi
35、nb(int a,int b);printf(输入个正整数输入个正整数:);scanf(%d,%d,&m,&n);if(m0&n0)l=maxj(m,n);s=minb(m,n);printf(%d和和%d的最大公约数为的最大公约数为%dn,m,n,l);printf(%d和和%d的最小公倍数为的最小公倍数为%dn,m,n,s);else printf(输入了负数输入了负数!n);return;int maxj(int a,int b)int r,t;if(ab)t=a;a=b;b=t;r=a%b;while(r!=0)a=b;b=r;r=a%b;return b;int minb(int a
36、,int b)int r;r=maxj(a,b);if(r!=0)return a*b/r;else return 0;sln78m 56trb78a56rb78a5633/习题习题 函数函数(7.5)#include#include#include void main()char a255;void convert(char b);printf(请输入一个字符串请输入一个字符串:n);gets(a);convert(a);printf(该字符串反序为该字符串反序为:n);puts(a);return;void convert(char b)int l,i;char c;l=strlen(b)
37、;for(i=0;i=l/2;i+)c=bi;bi=bl-i-1;bl-i-1=c;return;caba1a0b1b0acbdefa254034m#include#include void main()float a,b,c,d,x2;void root0(float a,float b,float c,float d,float x);void root1(float a,float b,float c,float x);void root2(float a,float b,float c,float d,float x);printf(请输入一元二次方程的三个系数请输入一元二次方程的三个
38、系数 a,b,c:n);scanf(%f,%f,%f,&a,&b,&c);if(a=1e-6)printf(不是一元二次方程不是一元二次方程!n);else printf(方程方程(%4.1f)x*x+(%4.1f)x+(%4.1f)=0n,a,b,c);d=b*b-4*a*c;if(d0)root0(a,b,c,d,x);printf(由于由于b*b-4*a*c0 因此有二个实根因此有二个实根:n);printf(x1=%f n,x1);printf(x2=%f n,x2);return;362.9.2 参数传递及函数返回值参数传递及函数返回值 (1)值传值传 一般变量一般变量 (2)传地址
39、传地址 结构结构,数组数组 (3)传引用传引用 一般变量一般变量,结构结构,数组数组 缺省参数缺省参数2.9.3 使用使用C+系统函数系统函数372.10 数组数组定义定义 类型类型 数组名数组名大小大小;int a4;int b34;int c234;使用时数组元素使用时数组元素 数组名数组名表达式表达式 a0=10;i=3;ai=5;b03=20;初始值初始值 定义时定义时 int a=2,4,6,8,10;int b3=2,4,6,8,10,12;382.11 指针指针定义定义 类型类型 *指针变量名指针变量名;2.11.1 使用指针使用指针 取地址运算符取地址运算符&取内容运算符取内容
40、运算符 *位移取值位移取值#include void main()int a10=2,4,6,8,10;for(int*p=a;pa+10;p+)cout p+0 endl;这里这里 p+0 位移位移+0,等价于,等价于*p p=a;p+2 即即*(p+2)p-i 即即*(p-i)392.11.2 指针运算指针运算1.赋值赋值 int x,*px,*q;px=&x;q=px;表示表示 q 和和 px 同指一个地方同指一个地方(q跟着跟着px指指)2.比较比较 px=q q!=px 判断判断 q 和和 px 是否同指一个地方是否同指一个地方 p q 判断判断 p 和和 q 指在数组元素的前后指在
41、数组元素的前后3.移动指针移动指针 p=p+3;+-运算运算 y=*px+;/y=*(px+);y=*+px;/y=*(+px);y=+*px;/y=+(*px);y=(*px)+;402.11.3 指针和数组指针和数组1.指向一维数组的指针指向一维数组的指针 int a4,*p;p=a;或或 p=&a0;即即 p 指向指向 a0;2.指针数组指针数组 许多个指针变量在一起都可用来指向整数许多个指针变量在一起都可用来指向整数 int*pa2;char*pc57;例例#include void main()int a23=2,4,6,8,10,12;int*pa2;/有二个指针有二个指针 pa0
42、 和和 pa1 pa0=a0;pa1=a1;for(int i=0;i2;i+)for(int j=0;j3;j+,pai+)cout aij=”*paiendl;413.指向整个数组的指针指向整个数组的指针(行指针行指针)如:如:int(*a)5;int b25=0,1,2,3,4,5,6,7,8,9 a=b;a b 0 1 2 3 4 5 6 7 8 9#include void main()int(*a)5;int b25=0,1,2,3,4,5,6,7,8,9;a=b;for(int i=0;i5;i+)cout i:*(*a+i)endl;a+;for(int i=0;i5;i+)c
43、out i:*(*a+i)endl;42一维数组的地址 int a4;a+0 是第是第 0 列的地址列的地址 a+i 是第是第 i 列的地址列的地址 *(a+0)是第是第 0 列的列的数据数据 *(*(a+i)是第是第 i 列的列的数据数据地址 a 数据*a&a0 a0一维数组的指针 int a4,*p;p=a;可以可以p+p+指针p 数据*p a043二维数组的地址 *a a0*a a0 int a34;*(a+i)+j是第 i 行第 j 列地址 *(*(*(a+i)+j)a+0 是第是第 0 行的地址行的地址 .a+i 是第是第 i 行的地址行的地址 *(a+0)是第是第 0 行第行第 0
44、 列的地址列的地址.*(*(a+0)+j是第是第 0 行第行第 j 列的地列的地址址 *(a+i)是第是第 i 行第行第 0 列的地址列的地址 .*(a+i)+j是第是第 i 行第行第 j 列的列的地址地址 *(*(*(*(a+0)+0)是第是第0行第行第0列的列的数据数据.(*.(*(a+0)+j)是第是第0行第行第j列的列的数数据据 *(*(*(*(a+i)+0)是第是第i行第行第0列的列的数据数据.*(*.*(*(a+i)+j)是第是第i行第行第j列的列的数数据据行地址 a+0 列地址*(a+0)行地址 a+i 44二维数组的指针 *a a0*a a0 int a34;(p+i*4+j)
45、是第i行第j列地址 (1)(1)int*p;(小指针)p=*a;p=*a;p=a;p=a;p=a0;p=a0;*(p+i*4+j)p=&a00;p=&a00;元素地址元素地址:p=*a+j;p=*a+j;p+jp+j p+;p+;元素数据元素数据:*p *(p+j)pj*p *(p+j)pj *(a+0)是第是第 0 行第行第 0 列的地址列的地址.*(*(a+0)+j是第是第 0 行第行第 j 列的地列的地址址 *(a+i)是第是第 i 行第行第 0 列的地址列的地址 .*(a+i)+j是第是第 i 行第行第 j 列的列的地址地址 *(*(*(*(a+0)+0)是第是第0行第行第0列的列的数
46、据数据.(*.(*(a+0)+j)是第是第0行第行第j列的列的数数据据 *(*(*(*(a+i)+0)是第是第i行第行第0列的列的数据数据.*(*.*(*(a+i)+j)是第是第i行第行第j列的列的数数据据 p 当一维数组名用但可当一维数组名用但可 p=p+i p+走走(i)一行一行 元素地址元素地址:*p+j*p+j 数据数据:*(*p+j)(*p)j*(*p+j)(*p)j列地址*(a+0)45struct student struct student int num;int num;float score;float score;struct student *next struct s
47、tudent *next;struct student *p;struct student *p;nextnumscore结点结点#include#include 申请空间函数:申请空间函数:malloc(malloc(字节数字节数)测试字节运算符:测试字节运算符:sizeof(sizeof(类型类型)p=(struct student*)malloc(sizeof(struct student)p=(struct student*)malloc(sizeof(struct student);释放空间函数:释放空间函数:free(free(指针);指针);free(p);free(p);nex
48、tnumscore结点结点p46p1=p2=(struct student*)malloc(LEN)p1=p2=(struct student*)malloc(LEN);scanf(“%d,%f”,&p1-num,&p1-score)scanf(“%d,%f”,&p1-num,&p1-score);nextnumscore结点结点p1 p2p220101 89.5headNULLn=0n=0 1 1head=p1;headnextnumscorep1p1=(struct student*)malloc(LEN)p1=(struct student*)malloc(LEN);2010320103
49、90902(n=2)p2-next=p1;(n=2)p2-next=p1;p2=p1p2=p1;p2p2scanf(“%d,%f”,&p1-num,&p1-score);scanf(“%d,%f”,&p1-num,&p1-score);nextnumscore p1p10 0NULLNULLp1-num=0p1-num=047p pp p0103070811NULLNULLheadheadp1p1p2p2p1p20103070811NULLNULLheadheadp0p005p1p1p p01030811headheadNULLp1p1p2p2482.11.4 引用引用 引用可为变量起别名,它
50、主要用作函数参数以及函数的返回类型。引用可为变量起别名,它主要用作函数参数以及函数的返回类型。有参数引用和返回值引用。有参数引用和返回值引用。1.引用说明引用说明 int num=50;int&ref=num;表示放整数表示放整数 50 的内存空间的内存空间 可叫可叫 num,又可叫,又可叫 ref 引用实质上是为另一个变量建立别名。引用实质上是为另一个变量建立别名。2.引用参数引用参数(传引用传引用)493.返回引用的函数返回引用的函数当一个函数的返回值需重新赋值的时候,我们也可对当一个函数的返回值需重新赋值的时候,我们也可对返回值进行引用,这时函数可出现在赋值号的左边。返回值进行引用,这时