程序设计软件工程专业c_第1页
程序设计软件工程专业c_第2页
程序设计软件工程专业c_第3页
程序设计软件工程专业c_第4页
程序设计软件工程专业c_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

1、1 1第2篇 面向过程的程序设计第第3章章 程序设计初步程序设计初步第第4章章 函数与预处理函数与预处理第第5章章 数组数组第第6章章 指针指针第第7章章 自定义数据类型自定义数据类型第6章 指针6.1 指针的概念指针的概念6.2 变量与指针变量与指针6.3 数组与指针数组与指针6.4 字符串与指针字符串与指针6.5 函数与指针函数与指针6.6 返回指针值的函数返回指针值的函数6.7 指针数组和指向指针的指针指针数组和指向指针的指针6.8 有关指针的数据类型和指针运算的小结有关指针的数据类型和指针运算的小结*6.9 引用引用 程序中定义的每一个变量,系统根据变程序中定义的每一个变量,系统根据变

2、量类型分配一定长度内存单元。量类型分配一定长度内存单元。 例如,例如,C+编译系统一般为整型变量分编译系统一般为整型变量分配配4个字节,为字符型变量分配个字节,为字符型变量分配1个字节。个字节。 内存区的每一个字节有一个编号,这就内存区的每一个字节有一个编号,这就是是“地址地址” 。6.1 指针的概念指针的概念注意注意: :内存单元的地址与内存单元的地址与内存单元的内容的区别。内存单元的内容的区别。直接存取方式:直接存取方式:按变量名存取变量值的方式。按变量名存取变量值的方式。直接将数直接将数3送到整型变量所标识的单元中。送到整型变量所标识的单元中。i = 3间接存取方式:间接存取方式:将将3

3、送到指针变量送到指针变量i_pointer所指向的所指向的单元(这就是变量单元(这就是变量i所标识的单元)中。所标识的单元)中。*i_pointer = 3任何类型的指针变量都是任何类型的指针变量都是unsigned long unsigned long intint型。占用型。占用4 4个字节个字节指针:指针:存放变量的地址。存放变量的地址。指针变量:指针变量:专门存放变量地址专门存放变量地址(即指针)的变量。(即指针)的变量。指针变量的值是地址(即指针)。指针变量的值是地址(即指针)。7 76.2 变量与指针变量与指针指针变量声明指针变量声明 基类型基类型 * 指针变量名指针变量名 例如:

4、例如: int *i_pointer; 说明:说明: (1) “ * ”表示指向;表示指向; (2) i_pointer是指针变量;是指针变量; (3) *i_pointer表示表示i_pointer指向的变量;指向的变量; (4) 该声明表示该声明表示i_pointer是一个指向整型变量的指针是一个指向整型变量的指针变量。变量。 i = 3; i = 3; * *i_pointer = 3;i_pointer = 3;8 86.2 变量与指针变量与指针指针变量初始化指针变量初始化 指针变量名初始地址;指针变量名初始地址; 例如:例如: int i; int *i_pointer; i_poi

5、nter = &i;int i;int *i_pointer = &i;或或6.2 变量与指针变量与指针指针变量引用指针变量引用 int i = 3; int *i_pointer; i_pointer = &i; *i_pointer = 5;/i_pointer中存放了变量中存放了变量i的地址的地址/相当于相当于 i = 5; & & 是取地址运算符;是取地址运算符; * * 是指针运算符。是指针运算符。例例1: &*i_pointer例例2: *&a&aa10106.2 变量与指针变量与指针注意:注意:“地址地址”中存放的数

6、据类型与指针类型必须相符。中存放的数据类型与指针类型必须相符。向指针变量赋的值必须是向指针变量赋的值必须是地址常量地址常量或或变量变量,不能是普通,不能是普通整数。但可以赋值为整数整数。但可以赋值为整数0,表示空指针。,表示空指针。 int int * *i_pointer = 2000;i_pointer = 2000;int int * *pa = &a;pa = &a;int int * *pb = pa;pb = pa; 1111例1:通过指针变量间接访问整型变量。#include using namespace std;int main( )int a,b; /定义整

7、型变量a,bint *pointer_1,*pointer_2; /定义指针变量*pointer_1,*pointer_2 a = 100; b = 10; /对a,b赋值pointer_1 = &a; /给pointer_1赋值pointer_2 = &b; /给pointer_2赋值cout a “ “ b endl; cout *pointer_1 “ “ *pointer_2 a b; p1 = &a; /使p1指向ap2 = &b; /使p2指向bif( a b )p = p1; p1 = p2; p2 = p; /将p1的指向与p2的指向交换cout

8、 a= a b= b endl; cout max= *p1 min= *p2 ab;pa=&a; /使pa指向apb=&b; /使pb指向bif(ab) swap(pa, pb); couta bendl; return 0;void swap ( int *p1, int *p2 ) int temp;temp=*p1; *p1=*p2;*p2=temp; 与形参不匹配与形参不匹配swap(*pa, *pb);1717如果将函数改为下面的形式,结果是什么?如果将函数改为下面的形式,结果是什么?void swap ( int *p1, int *p2 ) int *temp;

9、temp=p1; p1=p2;p2=temp; p1p1p2p2&b&b&a&a3 34 4a ab bpapapbpb&a&a&b&b3 34 4a ab bp1p1p2p2&a&a&b&b3 34 4a ab bpapapbpb&a&a&b&b3 34 4a ab b(1)main(1)main内内(2)(2)函数内函数内(3)(3)函数内函数内(4)main(4)main内内1818总结:总结:(1) 不能企图通过改变形参指针变量的值而使实参指针不能企图通过改变

10、形参指针变量的值而使实参指针 变量的值改变。变量的值改变。(2) 函数的调用最多只能有一个返回值,而使用指针变函数的调用最多只能有一个返回值,而使用指针变 量作函数参数,可通过指针变量改变主调函数中变量作函数参数,可通过指针变量改变主调函数中变 量的值,相当于通过函数调用从被调用的函数中得量的值,相当于通过函数调用从被调用的函数中得 到多个值。到多个值。指针变量可以指向数组元素(把某一元素的地址放到一指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)。个指针变量中)。int a10; /定义定义10个元素的整型数组个元素的整型数组aint *p; /定义一个基类型为整型的指针变量定

11、义一个基类型为整型的指针变量pp=&a0; /将将a0的地址赋给指针变量的地址赋给指针变量p,使使p指向指向a06.3 数组与指针数组与指针 6.3.1 指向一维数组元素的指针指向一维数组元素的指针6.3 数组与指针数组与指针 6.3.1 指向一维数组元素的指针指向一维数组元素的指针指向数组元素的指针指向数组元素的指针 所谓数组元素的指针就是数组元素的地址。所谓数组元素的指针就是数组元素的地址。 例:例: int a10; /定义一个整型数组定义一个整型数组a int *p; /定义一个基类型是整型的指针变量定义一个基类型是整型的指针变量 p = &a0; /将将a0的地址给指

12、针变量的地址给指针变量p p = a; /将数组的首地址给指针变量将数组的首地址给指针变量p *p = 3; /相当于相当于 a0 = 3; *(p+1) = 4; /相当于相当于 a1 = 4;说明:说明:(1) p+i和和a+i就是就是ai的地址;的地址;(2)*(p+i)或或*(a+i)是是p+i或或a+i所所指向的数组元素,即指向的数组元素,即ai。(3)引用一个数组元素,可用以引用一个数组元素,可用以下方法:下方法: 下标法下标法,如,如a i 形式;形式; 指针法指针法,如,如*(a+i)或或 *(p+i)。例: int main() int a = 1,2,3; int *p;

13、p = a; int i; 输出a数组中各值; return 0; 方法一:方法一: for(i = 0; i 3; i+) cout ai endl;方法二:方法二: for(i = 0; i 3; i+) cout pi endl;方法三:方法三: for(i = 0; i 3; i+) cout *(p+i) endl;方法四:方法四: for(i = 0; i 3; i+) cout *(a+i) endl;方法五:方法五: for(p = a,i = 0; i 3; i+,p+) cout *p endl;方法六:方法六: for(p = a; p a+3; p+) cout *p

14、endl;其中,采用方法六可以提高执行效率。其中,采用方法六可以提高执行效率。注意:注意:切实保证指针变量切实保证指针变量p p指向数组中有效的元素。指向数组中有效的元素。例如:例如: int a10int a10; int int * *p=a; /p=a; /指针变量指针变量p p的初值为的初值为&a0&a0 cout cout* *(p+10); /(p+10); /要输出要输出a10a10的值的值越界越界指针变量的算术运算指针变量的算术运算 如果先使如果先使p指向数组指向数组a的首元素的首元素(即即p=a),则:则: (1) p+(或(或p+=1)。使。使p指向下一元素

15、,即指向下一元素,即a1。如果。如果 用用*p,得到下一个元素,得到下一个元素a1的值的值; 例如:例如: int a3 = 1,2,3; int *p = a; p+; cout *p endl; /输出输出a1的值的值 (2) *p+与与*+p作用不同。作用不同。 *p+是先取是先取*p的值,再使的值,再使p+; *+p是先使是先使p+,再取,再取*p的值。的值。 例如:例如: int a3 = 1,2,3; int *p = a; cout *p+ endl; cout *+p endl; /输出输出a0的值,的值,p=p+1/p=p+1,输出输出a2的值的值 (3) (*p)+表示表示

16、p所指向的元素值加。所指向的元素值加。 例如:例如: int a3 = 1,5,9; int *p = a; cout (*p)+ endl; /先输出先输出*p的值,再对该值加的值,再对该值加1, 即即a0=1+1=2cout +(*p) endl;/先对先对*p的值加的值加1,即,即a0=2+1=3,再输出再输出*p的值的值2828例如:输出数组例如:输出数组a的的100个元素个元素p = a;while(p a+100) cout *p; p+;p = a;while(p a+100) cout *p+;2929例例1:循环移位问题:循环移位问题 如:如:1 2 3 4 5 向左移动向左

17、移动1位位2 3 4 5 13030int main( ) int a5=1,2,3,4,5;int *p=a;int temp;temp=*p; /保留第一个数while(p=a+3) /将后面4个数向前移一位*p=*(p+1);p+; /移动指针位置*p=temp; /最后放上保留的第一个数for(p=a;p=a+4;p+)cout*p ;coutendl;return 0;6.3.2 用指针变量作函数参数接收数组地址用指针变量作函数参数接收数组地址void sort(int a,int n)void sort(int a,int n) a a其实就是指针常量其实就是指针常量void so

18、rt(int void sort(int * *a,int n)a,int n) 回顾:回顾: 数组名代表数组首元素的地址。用数组名作数组名代表数组首元素的地址。用数组名作函数的参数,传递的是数组首元素的地址。函数的参数,传递的是数组首元素的地址。例例6.6 6.6 将将1010个整数按由小到大的顺序排列。个整数按由小到大的顺序排列。3333例:将10个整数按由小到大的顺序排列。int main() int a10; int i; for( i=0; i ai; sort(a,10); return 0;void sort(int *p, int n) int i,j,min,t; for(

19、i=0; in-1; i+) min = i; for( j= i+1; jn; j+) if (*(p+j) *(p+ min) min = j; t = *(p+i); *(p+i) = *(p+ min); *(p+ min) = t; 实际上函数调用时并不存在一个占有存储空实际上函数调用时并不存在一个占有存储空间的形参数组,只有指针变量。间的形参数组,只有指针变量。实参与形参的结合,有以下实参与形参的结合,有以下4种形式:种形式: 实实 参参 形形 参参数组名数组名 数组名数组名 数组名数组名 指针变量指针变量指针变量指针变量 数组名数组名指针变量指针变量 指针变量指针变量3535总结

20、:总结: (1)实参数组名实参数组名a代表一个固定的地址,或者说是指针代表一个固定的地址,或者说是指针型常量,因此要改变型常量,因此要改变a的值是不可能的。的值是不可能的。 如:如: int a3 = 1,2,3; a+; (2)形参数组名是指针变量,并不是一个固定的地址形参数组名是指针变量,并不是一个固定的地址值。它的值是可以改变的。值。它的值是可以改变的。 如:如:void f(int x ) x+; cout *x n;for(pa=a; pa *pa;cin m;for(pb=b; pb *pb; pc = c; pa = a; pb = b;3838while(1)*pc+ = *p

21、a+;*pc+ = *pb+;if ( pa = a+n ) while( pb = b+m )while( pa a+n ) *pc+ = *pa+;break;int *p;for (p=c; ppc; p+)cout *p “ “ ;cout endl;return 0;1. 多维数组元素的地址多维数组元素的地址设有一个二维数组,它有设有一个二维数组,它有3行行4列。它的定义为列。它的定义为int a34=1,3,5,7,9,11,13,15,17,19,21,23;6.3.3 多维数组与指针多维数组与指针可认为二维数组是可认为二维数组是“数组的数组数组的数组”,数组,数组a a是是由由

22、3 3个一维数组构成。个一维数组构成。40406.3.3 多维数组与指针多维数组与指针注意:注意:(1) a代表的是首行的起始地址,即代表的是首行的起始地址,即&a0; a+1代表的是代表的是a1行的首地址,即行的首地址,即&a1; a+2代表的是代表的是a2行的首地址,即行的首地址,即&a2;(2) a0代表一维数组代表一维数组a0中中0列元素的地址,即列元素的地址,即&a00; a1代表一维数组代表一维数组a1中中0列元素的地址,即列元素的地址,即&a10; a2代表一维数组代表一维数组a2中中0列元素的地址,即列元素的地址,即&a20;41

23、41地址地址42426.3.3 多维数组与指针多维数组与指针a01 *(a0+1)a0 *(a+0)a01 a01 * *( (* *(a+0)+1)(a+0)+1)由此可推出:数组中由此可推出:数组中i i行行j j列的值的指针表示法为列的值的指针表示法为* *( ( * *(a + i) + j ) a i j (a + i) + j ) a i j 43436.3.3 多维数组与指针多维数组与指针2. 指向多维数组元素的指针变量例:输出二维数组各元素的值。int main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p; /p是基类型为

24、整型的指针变量是基类型为整型的指针变量 for(p=a0; p=a0+11; p+) cout*p “ “; coutendl; return 0;44446.3.3 多维数组与指针多维数组与指针说明: p是指向整型数据的指针变量,在for语句中对p赋初值 a0,也可以写成“p=&a00”。思考:思考: 可否用可否用 p = a p = a 语句赋初值?语句赋初值?45456.3.3 多维数组与指针多维数组与指针指向数组的指针变量(数组指针)基类型基类型 ( (* *数组名数组名)一维数组长度一维数组长度 如:如:int (int (* *p)4;p)4;p=&a0p=&

25、;a0则则p+1=? p+1=? p p的增值以一维数组的长度为的增值以一维数组的长度为单位单位,如图示。,如图示。a1a1例例6.8 输出二维数组任意一行任意一列元输出二维数组任意一行任意一列元素的值。素的值。(用指向一维数组的指针变量实现用指向一维数组的指针变量实现)* *( (* *( (p+2)+3)p+2)+3)是是a23a23的值。的值。4747例:输出二维数组任意一行任意一列元素的值。例:输出二维数组任意一行任意一列元素的值。#include using namespace std;int main( ) int a34 = 1,3,5,7,9,11,13,15,17,19,21

26、,23; int (*p)4, i, j; cinij; p=a; cout *(*(p + i) + j) endl; return 0;48486.3.3 多维数组与指针多维数组与指针3. 用指向数组的指针作函数参数用指向数组的指针作函数参数例:输出二维数组各元素的值(用函数实现)。例:输出二维数组各元素的值(用函数实现)。#include using namespace std;void output(int (*p)4); /函数声明函数声明int main( ) int a34=1,3,5,7,9,11,13,15,17,19,21,23; output(a); /多维数组名作函数参

27、数多维数组名作函数参数 return 0; 4949void output(int (*p)4) /形参是指向一维数组的指针变量形参是指向一维数组的指针变量int i,j;for(i=0;i3;i+) for(j=0;j4;j+) cout*(*(p+i)+j) ; coutendl; 6.3.3 多维数组与指针多维数组与指针50506.4 字符串与指针字符串与指针在在C+中可以用中可以用3种方法访问一个字符串种方法访问一个字符串1. 用字符数组存放一个字符串用字符数组存放一个字符串例例: 定义一个字符数组并初始化,然后输出其中的定义一个字符数组并初始化,然后输出其中的字符串。字符串。 int

28、 main( ) char str =I love CHINA!; coutstrendl; return 0; 51516.4 字符串与指针字符串与指针2. 用字符串变量存放字符串用字符串变量存放字符串 int main( ) string str = I love CHINA!; cout str endl; return 0; 52526.4 字符串与指针字符串与指针3. 用字符指针指向一个字符串用字符指针指向一个字符串 int main( ) char *str = I love CHINA!; coutstrendl; return 0; 5353例:将字符串例:将字符串str1复制

29、为字符串复制为字符串str2。int main( ) char str1 =“I love CHINA!”,str220; char *p1,*p2; for(p1=str1,p2=str2;*p1!=0;p1+,p2+) *p2=*p1; *p2=0; /以以0作为字符串的结束标志作为字符串的结束标志 p1=str1;p2=str2; coutstr1 is: p1endl; coutstr2 is: p2endl; return 0;5454运行结果为:str1 is: I love CHINA!str2 is: I love CHINA!5555例如:例如: int a34 = 1,3,

30、5,7,9,11,13,15,17,19,21,23; int *p3; 说明说明p是一个由是一个由3个元素组成的一维数组,每个元素个元素组成的一维数组,每个元素均为一个指向整型数据的指针。均为一个指向整型数据的指针。 要想使要想使p0、p1、p2分别指向数组分别指向数组a的第的第0行、第行、第1行、第行、第2行,可使用如下的循环语句:行,可使用如下的循环语句: for(int i = 0; i 3; i+) pi = ai;6.7 指针数组和指向指针的指针指针数组和指向指针的指针 6.7.1 指针数组的概念指针数组的概念5656数组p与数组a的关系 1 1 3 3 5 5 7 7 9 9 1

31、1 11 13 13 15 15 17 17 19 19 21 21 23 23p1p1p2p2p0p0a00a00a01a01a02a02a10a10a11a11a12a12a13a13a03a03a20a20a21a21a22a22a23a235757用指针数组用指针数组p来获得来获得a数组中的元素数组中的元素a i j ,常见的表,常见的表达式形式有:达式形式有:*(p i + j); 或或 p i j ;指针数组最常见的应用是对字符串的处理。指针数组最常见的应用是对字符串的处理。例如:例如: char char * *p3 = p3 = “BasicBasic”, , ”PascalP

32、ascal”, , ”C+C+”;p0p0p1p1p2p2B Ba as si ic c00P Pa as sc ca al l00C C+ + +005858指针数组与二维字符数组的关系指针数组与二维字符数组的关系例如:例如:int main() char a210 = “hello”, ”world” ; char *s2; int i; for(i = 0; i 2; i+) s i = a i ; for(i = 0; i 2; i+) cout s i endl;将字符指针数组中的每个将字符指针数组中的每个元素分别指向二维字符数元素分别指向二维字符数组中每一行的首地址。组中每一行的首

33、地址。5959指针数组与二维字符数组的关系指针数组与二维字符数组的关系 h h e e l l l l 0 0 0 0 w w o o r r l l d d 0 0 o o k k 0 0 a0 a0 a1 a1 a2 a2s0s0s1s1s2s2s0s0、s1s1、s2s2中分别存放了中分别存放了a0a0、a1a1、a2a2的值,即每一行的首地址(的值,即每一行的首地址(&a00&a00、&a10&a10、&a20&a20)。)。6060指针数组练习指针数组练习输入任意输入任意n n个整数存入数组中,然后,在个整数存入数组中,然后,在“不改变

34、数不改变数组元素值组元素值!“的情况下,按照从小到大的顺序输出这的情况下,按照从小到大的顺序输出这n n个数。(要求:用指针数组实现,个数。(要求:用指针数组实现,n=20n=20) p pa a1 12 23 34 4P P是指针数组,是指针数组,数组中的每数组中的每个元素分别个元素分别存放整型数存放整型数组组a a中每个单中每个单元的地址。元的地址。若干字符串按字母顺序(由小到大)输出。若干字符串按字母顺序(由小到大)输出。(不改变字符数组中字符串的位置不改变字符数组中字符串的位置)62626.7.2 指向指针的指针指向指针的指针指针变量有其自身的存储单元,该存储单元的指针变量有其自身的存

35、储单元,该存储单元的地址又可以放在另一个指针变量中,后一个指地址又可以放在另一个指针变量中,后一个指针变量就称为指向指针的指针。针变量就称为指向指针的指针。p p&a&a3 3a a&t&tt t例如:例如: int a = 3;int a = 3; int int * *t = &a; t = &a; int int * * *p;p; * *p = &t;p = &t; cout cout * * *p endl; p endl; 63636.7.2 指向指针的指针指向指针的指针 a0 a0 a1 a1 a2 a2s0s0s1

36、s1s2s2hellohelloworldworldokokp pchar a310,char a310,* *s3;s3;char char * *( (* *p); /p); /也可以写成也可以写成 char char * * *p;p;其中其中s s数组中存放的都是指针,因此数组中存放的都是指针,因此p p就是指向指针就是指向指针的指针。的指针。int *.*p ; 实际上在程序中很少超过二级间址。实际上在程序中很少超过二级间址。单级间址单级间址二级间址二级间址6565int main() char a310 = hello, world, ok; char *s3; char *p;

37、int i; for(i = 0; i 3; i+) si = ai; p = s; for(i = 0; i 3; i+,p+) cout *p endl; cout *p endl; /输出一个字符串输出一个字符串/输出每个字符串中的输出每个字符串中的 第一个字符第一个字符p p是指向指针的指针变量,而是指向指针的指针变量,而s s是指向指针的指针常量是指向指针的指针常量/定义定义s s是一个指针数组是一个指针数组6666输入输入n n个字符串个字符串(n=10)(n n;for(i = 0; i stri;for(i = 0; i n; i+) si = stri; p = s; if(

38、*(p+i) = A) /通过指针的指针获得字符串的第一个字符通过指针的指针获得字符串的第一个字符 cout stri endl;return 0; 6.8 有关指针的数据类型和指有关指针的数据类型和指针运算的小结针运算的小结定义定义含义含义int i;int i;定义整型变量定义整型变量int int * *p;p;p p为指向整型数据的指针变量为指向整型数据的指针变量int an;int an;定义整型数组定义整型数组a a,它有,它有n n个元素个元素int int * *pn;pn;定义指针数组定义指针数组p p,它由,它由n n个指向整型数据的指针元素组成个指向整型数据的指针元素组成

39、int int ( (* *p)n;p)n;p p为指向含为指向含n n个元素的一维数组的指针变量个元素的一维数组的指针变量int int * * *p;p;p p是一个指向指针的指针变量,是一个指向指针的指针变量,它指向一个指向整型数据的指针变量它指向一个指向整型数据的指针变量68686.8 指针运算的小结指针运算的小结l指针运算小结指针运算小结 (1) (1) 指针变量加指针变量加/ /减一个整数减一个整数 例如:例如: p+p+,p-p-等;等; (2) (2) 指针变量赋值指针变量赋值 将一个变量地址赋给一个指针变量。将一个变量地址赋给一个指针变量。 例如:例如: int a10, b

40、;int a10, b; int int * *pa, pa, * *pb;pb; pa = a; pa = a; pb = &b; pb = &b;69696.8 指针运算的小结指针运算的小结 (3) (3) 指针变量可以有空值,即该指针变量不指向任指针变量可以有空值,即该指针变量不指向任何变量。何变量。 例如:例如:void a; void *p; int *pint, i; p = null; p = &i; pint = (int*)p; /错,不能声明错,不能声明voidvoid类型的变量类型的变量/对,可以声明对,可以声明voidvoid类型的指针类型的指针

41、/相当于相当于p = 0; p = 0; 即空指针即空指针/对,对,voidvoid类型指针指向整型变量类型指针指向整型变量/void/void指针赋值给指针赋值给intint指针需要类型指针需要类型强制转换强制转换p=NULL; /指针变量为空值指针变量为空值在在iostream头文件中定义头文件中定义: #define NULL 0NULL代表整数代表整数0,但系统中没有地址为,但系统中没有地址为0的单元,因的单元,因此指针变量不指向任何有效单元。此指针变量不指向任何有效单元。注意,注意,p的值等于的值等于NULL和和p未被赋值是两个不同的概未被赋值是两个不同的概念。念。注意事项注意事项:

42、71716.8 指针运算的小结指针运算的小结 (4) (4)两个指针变量可以相减两个指针变量可以相减 如果两个指针变量指向同一个数组的元素,则两个如果两个指针变量指向同一个数组的元素,则两个指针变量值之差是两个指针之间的元素个数。指针变量值之差是两个指针之间的元素个数。 例如:例如: p1 = &a1;p1 = &a1; p2 = &a4; p2 = &a4; 则:则:p2-p1 = 3p2-p1 = 3。72726.8 指针运算的小结指针运算的小结 (5)(5)两个指针变量可以比较两个指针变量可以比较 若两个指针指向同一个数组的元素,则可以进行比若两个指针指向

43、同一个数组的元素,则可以进行比较。较。指向前面的元素的指针变量小于指向后面元素的指指向前面的元素的指针变量小于指向后面元素的指针变量。针变量。 例如:例如: p1 = &a1;p1 = &a1; p2 = &a4; p2 = &a4; 则:则:p1 p2p1 p2。注意:如果注意:如果p1p1和和p2p2不指向同一数组则比较无意义。不指向同一数组则比较无意义。总结:总结:使用指针的优点:使用指针的优点: 提高程序效率;调用函数时提高程序效率;调用函数时,能在被调用函数中改变主调函数中多个变量的值;,能在被调用函数中改变主调函数中多个变量的值;可以实现动态存储分配

44、。可以实现动态存储分配。 但是,指针使用太灵活,对熟练的程序员来说,但是,指针使用太灵活,对熟练的程序员来说,可以利用它编写出颇有特色、质量优良的程序,实现可以利用它编写出颇有特色、质量优良的程序,实现许多用其他高级语言难以实现的功能,但也十分容易许多用其他高级语言难以实现的功能,但也十分容易出错,而且这种错误往往难以发现。出错,而且这种错误往往难以发现。7474*6.9 引用引用l引用的定义引用的定义 引用即别名,代表的是同一个变量。引用即别名,代表的是同一个变量。 基类型基类型 & &变量名;变量名; 例如:例如:int a = 10;int a = 10; int &am

45、p;b = a;int &b = a; b b即为即为a a的别名,在内存的别名,在内存 中占同一个存储单元。中占同一个存储单元。 b = 30; /b = 30; /相当于相当于a=30;a=30;7575*6.9 引用引用注意:注意: int a1, a2;int a1, a2; int &b = a1; int &b = a1; int &b = a2; int &b = a2;不同的变量使用相同的别名是不允许的。不同的变量使用相同的别名是不允许的。声明引用类型变量时,必须同时初始化,即声声明引用类型变量时,必须同时初始化,即声明它代表哪一个变量。

46、明它代表哪一个变量。一旦初始化后,不能改变引用变量的值。一旦初始化后,不能改变引用变量的值。int a1int a1,a2;a2;int &b = a1;int &b = a1;&b = a2;&b = a2;b = a2;b = a2;b = 23;b = 23;int a1int a1,a2;a2;int &b2 = a1int &b2 = a1,a2;a2;不能定义引用类型的数组。不能定义引用类型的数组。7777*6.9 引用引用例例: 引用和变量的关系。引用和变量的关系。 int main( ) int a=10; int &b=

47、a; a=a*a; couta“ “bendl; b=b/5; coutb“ “aendl; return 0; 7878例:将两个整数a和b的值交换。1 1、整型变量作为函数参数、整型变量作为函数参数int main( )int main( ) int i=3,j=5; int i=3,j=5; swap(i, j ); swap(i, j ); / /调用函数调用函数swapswap couti couti“ “ jendl; jendl; return 0;return 0; void swap(void swap(int a, int bint a, int b) /) /函数定义,形

48、参是整型变量函数定义,形参是整型变量 int temp; int temp; temp = a; temp = a; a = b; a = b; b = temp; b = temp; 7979例:将两个整数a和b的值交换。2 2、指针变量作为函数参数、指针变量作为函数参数int main( )int main( ) int i=3,j=5; int i=3,j=5; swap(&i, &j);swap(&i, &j); / /实参是变量的地址实参是变量的地址 cout i cout i “ ” j endl; j endl; return 0;return 0

49、; void swap(void swap(int int * *p1,int p1,int * *p2p2) /) /形参是指针变量形参是指针变量 int temp; int temp; temp = temp = * *p1; p1; * *p1 = p1 = * *p2;p2; * *p2 = temp;p2 = temp; 8080例:将两个整数a和b的值交换。3 3、变量引用作为函数参数、变量引用作为函数参数int main( )int main( ) int i=3,j=5; int i=3,j=5; swap(i, j);swap(i, j); / /实参是变量实参是变量 cou

50、t i cout i “ ” j endl; j endl; return 0;return 0; void swap(void swap(int &a, int &bint &a, int &b) /) /形参是整型变量的引用形参是整型变量的引用 int temp; int temp; temp = a; temp = a; a = b; a = b; b = temp; b = temp; 8181总结:总结: (1) (1) 用整型变量作为函数参数,不能将变量的值交换用整型变量作为函数参数,不能将变量的值交换过来;过来; (2) (2) 用指针、变量别名作

51、为函数参数,可以完成变量用指针、变量别名作为函数参数,可以完成变量值的交换。值的交换。思考:引用类型变量作形参和指针变量作形思考:引用类型变量作形参和指针变量作形参的区别?参的区别?引用比指针变量简单、直观、方便。使用变引用比指针变量简单、直观、方便。使用变量的引用,可以部分代替指针的操作。量的引用,可以部分代替指针的操作。指针变量要另外开辟内存单元,其内容是地址。指针变量要另外开辟内存单元,其内容是地址。而引用变量不是一个独立的变量,不单独占内存而引用变量不是一个独立的变量,不单独占内存单元。单元。C+动态分配和撤销内存运算符:动态分配和撤销内存运算符:new和和deleteC动态分配和撤销内存函数:动态分配和撤销内存函数:malloc和和free函数。函数。注意:注意: new和和delete是运算符,不是函数,因此执是运算符,不是函数,因此执行效率高。行效率高。*

温馨提示

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

最新文档

评论

0/150

提交评论