资源预览内容
第1页 / 共75页
第2页 / 共75页
第3页 / 共75页
第4页 / 共75页
第5页 / 共75页
第6页 / 共75页
第7页 / 共75页
第8页 / 共75页
第9页 / 共75页
第10页 / 共75页
亲,该文档总共75页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第十章,指针,10.1地址和指针的概念,内存区的每一个字节有一个编号,这就是“地址” 。,地址:,又叫“指针”,int型变量i的值是3,地址是2000;有一个指针ipointer,值为2000;那么这个ipointer就指向以其值2000为地址的内存单元,即,指向变量i,如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。 i_pointer就是一个指针变量。,指针变量:,这种变量的值是某变量的地址,可以指向以该值为地址的单元 类型是一个指针,指针变量除了类型是指针外,会不会涉及其它类型? 指针变量需不需要区分究竟它所指向的内存单元中的数据是什么类型的? 之所以要用指针变量,就是希望能够通过它直接访问某个内存单元中的数据,既然要访问这些数,必然涉及到这些数的操作,既然有操作,必然和类型相关。所以定义指针型变量时,必须指明该指针变量所指向的内存单元中数据的类型,10.2 变量的指针和指向变量的指 针变量,10.1 定义一个指针变量,要定义一个指针变量,要指明两种类型,一种是指针型,一种是所指向的单元中数据的类型 基本格式为 所指向的数据类型 *指针变量名 如 int *i_point; float *f_point_a; char *c_point1;,在定义指针变量时要注意两点:,指针变量前面的“*”,表示该变量的类型为指针型变量。 例: float *pointer_1; 指针变量名是pointer_1 ,而不是* pointer_1 。,(2) 在定义指针变量时必须指定基类型。 只有整型变量的地址才能放到指向整型变量的指针变量中。 float a; int * pointer_1; 想将变量a的地址赋给指针变量pointer_1是错误的,10.2.2 指针变量的引用,给它赋值 ,用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。 例如: pointer_; pointer_;,从它取值 *指针运算符,表示紧跟在其后的那个指针变量所指向的内存单元 *指针变量名 如,*i_point, j=*i_point;,注意:,指针变量只有赋值后才能使用,使用没有被赋值的指针变量会很危险,有可能造成系统瘫痪 给指针变量赋值时,一定要注意类型的一致 可将一个已赋值的指针赋给另一个同类型的指针,如:int a,*p,*q; p=,例10. 通过指针变量访问整型变量,#include voidmain ( ) int ,; int *pointer_, *pointer_; ; pointer_; /*把变量的地址赋给 pointer_1 */ pointer_; /*把变量的地址赋给 pointer_ */ printf(%,%,); printf(%,%,*pointer_, *pointer_); ,对“”和“*”运算符说明: 如果已执行了语句 pointer_; (1)* pointer_的含义是什么?,“”和“*”两个运算符的优先级别相同,但按自右而左方向结合。因此,* pointer_与相同,即变量a的地址。 * pointer_与pointer_等价。 如果有pointer_2 * pointer_ ;它的作用是将(的地址)赋给pointer_2 ,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。,(2) *的含义是什么?,(3) (*pointer_)相当于。,*point_1+ 相当于 *(point_1+) 求出point_1所指向的单元中的值,然后point_1中的地址增1个单位(根据指针类型决定单位字节数),先进行运算,得的地址,再进行*运算。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。,例10 . 2 输入和两个整数,按先大后小的顺序输出 和。,#include void main() int *1,*2,*,; scanf(,); 1; if() ; printf(=,=,); printf(max=,min=,*1,*2); ,运行情况如下: , , ,,指针可以作为函数的形参和实参传址调用。 若将存放变量的地址传给被调函数,被调函数的形参必须是指针型变量。 在被调函数中可以通过间接访问的方式得到或修改实参的内容。 这种方法使数据传输安全可靠,而且可以实现多个数据的双向传递。,10.3 指针变量作为函数参数,#include void swap(int,int); void main( ) int a,b; a=2,b=6; if (ab) swap(a,b); printf(“%d,%d”,a,b); ,void swap(int x, int y) int temp; temp=x; x=y; y=temp; /printf(“%d,%d”,x,y); ,例10 . 3 对输入的两个整数按大小顺序输出,#include void main() void swap(int *p1,int *p2); int a,b; int *pointer_1,*pointer_2; a=5;b=9; pointer_1= ,void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; ,*1,返回值方式,但只能返回一个值。 使用全局变量,可以传递多个值,但是不安全。 传址调用,可以传递多个值,而且安全。,函数间数据“双向”传递的方法:,10.3 数组与指针,数组元素的指针就是数组元素的地址。 数组的指针就是数组的首地址,例如: ; *;,10.3.1 指向数组元素的指针,一维数组名表示数组的首地址。(或用 while(*p) p+; printf(The string length is %dn,p-s); ,运行结果如下: The string length is 7,10.3 用数组名作函数参数,void main() (int arr,int ); int array; (array,); int (int arr,int ) ,实参是一维数组名,即一维数组的首地址。 形参应为与实参数组同数据类型的数组或指针变量,例10 将数组中个整数按相反顺序存放。,#include void main() void inv(int ,int ); int , ,; printf(The original array:); for(;) printf (,); printf(); inv (,); printf(The array has been in verted:); for(;) printf (,); printf (); ,void inv(int ,int ) /*形参x是数组名*/ int temp,(); for(;) ; temp; ; temp; return; ,#include void main() void inv(int *,int ); int , ,; printf( The original array: ); for(;) printf (,); printf (); inv(,); printf ( The array has been in verted: ); for(;) printf (,); printf ();,对刚才的程序可以作一些改动。将函数inv中的形参改成指针变量。,void inv(int *,int ) /*形参x为指针变量*/ int,temp,*,*,(); ; for(;,) temp*; *; *temp; return; ,如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下种情况:,(1) 形参和实参都用数组名,如: void main() void (int ,int ) int ; (,); ,(2) 实参用数组名,形参用指针变量。如: void () void (int *,int ) int ; (,); ,(3)实参形参都用指针变量。例如: void main() void (int *,int ) int , *p=a; (p,); ,(4) 实参为指针变量,形参为数组名。如: void main() void (int x ,int ) ,*p=a; (p,); ,#include void main() void inv(int *,int ); int ,*; printf(The original array:n ); for(;,) scanf(,); printf(); ; inv(,); /* 实参为指针变量 */ printf(The array has been inverted :); for(; ) printf(,*); printf(); ,void inv(int *,int ) int ,temp,*,*; (); ; for(;,) emp*;*;*temp; return; ,例109 用选择法对个整数按由大到小顺序排序。,#include void main() void sort(int x ,int n); int *p,i,a10; p=a; for(i=0;i10;i+) scanf(%d,p+); p=a; sort(p,10); for(p=a,i=0;i10;i+) printf(%d,*p);p+; ,void sort(int x ,int n) int i,j,k,t; for(i=0;ixk) k=j; if(k!=i) t=xi; xi=xk; xk=t; ,*(xj),*(xk),10. 字符串与指针,10.4.字符串的表示形式,例 10.5 定义一个字符数组,对它初始化, 然后输出该字符串,#include void main() char stringI love China!; printf(,string); ,(1) 用字符数组存放一个字符串,然后输出该字符串。,(2) 用字符指针指向一个字符串。 可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。,例106 定义字符指针 #include void main() char *string= I love China!; printf(%sn,string); ,char *string; scanf(%s,string);,X,例10.7 将字符串复制为字符串。,#include void () char am a boy,20; int ; for(;*()!;) *()*(); *(); printf(string a is :,); printf(string b is:); for(;!;) printf(,); printf(); ,b=ai,puts(b),也可以设指针变量,用它的值的改变来指向字符串中的不同的字符。,例10.8 用指针变量来处理例107问题。,#include void main() char =I am a boy. ,20,*p1,*p2; int ; ;
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号