程序设计基础第10章指针_第1页
程序设计基础第10章指针_第2页
程序设计基础第10章指针_第3页
程序设计基础第10章指针_第4页
程序设计基础第10章指针_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

1、第十章,指针,10.1地址和指针的概念,内存区的每一个字节有一个编号,这就是“地址” 。,地址:,又叫“指针”,int型变量i的值是3,地址是2000;有一个指针ipointer,值为2000;那么这个ipointer就指向以其值2000为地址的内存单元,即,指向变量i,如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。 i_pointer就是一个指针变量。,指针变量:,这种变量的值是某变量的地址,可以指向以该值为地址的单元 类型是一个指针,指针变量除了类型是指针外,会不会涉及其它类型? 指针变量需不需要区分究竟它所指向的内存单元中的数据是什么类型的? 之所以要用指针变

2、量,就是希望能够通过它直接访问某个内存单元中的数据,既然要访问这些数,必然涉及到这些数的操作,既然有操作,必然和类型相关。所以定义指针型变量时,必须指明该指针变量所指向的内存单元中数据的类型,10.2 变量的指针和指向变量的指 针变量,10.1 定义一个指针变量,要定义一个指针变量,要指明两种类型,一种是指针型,一种是所指向的单元中数据的类型 基本格式为 所指向的数据类型 *指针变量名 如 int *i_point; float *f_point_a; char *c_point1;,在定义指针变量时要注意两点:,指针变量前面的“*”,表示该变量的类型为指针型变量。 例: float *poi

3、nter_1; 指针变量名是pointer_1 ,而不是* pointer_1 。,(2) 在定义指针变量时必须指定基类型。 只有整型变量的地址才能放到指向整型变量的指针变量中。 float a; int * pointer_1; 想将变量a的地址赋给指针变量pointer_1是错误的,10.2.2 指针变量的引用,给它赋值 ,用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。 例如: pointer_; pointer_;,从它取值 *指针运算符,表示紧跟在其后的那个指针变量所指向的内存单元 *指针变量名 如,*i_point, j=*i_point;,注意:,指针变量只

4、有赋值后才能使用,使用没有被赋值的指针变量会很危险,有可能造成系统瘫痪 给指针变量赋值时,一定要注意类型的一致 可将一个已赋值的指针赋给另一个同类型的指针,如:int a,*p,*q; p=,例10. 通过指针变量访问整型变量,#include voidmain ( ) int ,; int *pointer_, *pointer_; ; pointer_; /*把变量的地址赋给 pointer_1 */ pointer_; /*把变量的地址赋给 pointer_ */ printf(%,%,); printf(%,%,*pointer_, *pointer_); ,对“”和“*”运算符说明:

5、 如果已执行了语句 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个

6、单位(根据指针类型决定单位字节数),先进行运算,得的地址,再进行*运算。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。,例10 . 2 输入和两个整数,按先大后小的顺序输出 和。,#include void main() int *1,*2,*,; scanf(,); 1; if() ; printf(=,=,); printf(max=,min=,*1,*2); ,运行情况如下: , , ,,指针可以作为函数的形参和实参传址调用。 若将存放变量的地址传给被调函数,被调函数的形参必须是指针型变量。 在被调函数中可以通过间接访问的方式得到或修改实参的内容。 这种方法使数据传

7、输安全可靠,而且可以实现多个数据的双向传递。,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;

8、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(T

9、he 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(;) prin

10、tf (,); 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(,); print

11、f ( 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) 实参用数组名

12、,形参用指针变量。如: 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(

13、,); /* 实参为指针变量 */ 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

14、(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) 用字符指针指向一个字符串。 可

15、以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。,例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(,)

16、; printf(); ,b=ai,puts(b),也可以设指针变量,用它的值的改变来指向字符串中的不同的字符。,例10.8 用指针变量来处理例107问题。,#include void main() char =I am a boy. ,20,*p1,*p2; int ; ; for(;*!;p1,p2) *;,*; printf(string is:,); printf( :); for(;!;) printf(,); printf(); ,程序必须保证使和同步移动,10.4.2 字符指针作函数参数,实参:数组名、字符指针变量 形参:数组名、字符指针变量,(1) 字符数组由若干个元素组成,每

17、个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。 (2)赋值方式。对字符数组只能对各个元素赋值,不 能用以下办法对字符数组赋值。 char str14; str=“I love China!”; 而对字符指针变量,可以采用下面方法赋值: char *; =“ I love China!”;,10.4.3 对使用字符指针变量和字符数组的讨论,字符数组和字符指针变量二者之间的区别:,(3)对字符指针变量赋初值: char * love China!;等价于 char *; I love Chian!; 而对数组的初始化: char st

18、r love China!; 不能等价于 char str; str I love China!;,(4) 定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址。,例如: char str; scanf(,str);,(5) 指针变量的值是可以改变的,10.7 指针数组和指向指针的指针,10.7.1 指针数组的概念,一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。 一维指针数组的定义形式为: 类型名 *数组名数组长度; 例如: char *;,例10

19、.6 将若干字符串按字母顺序(由小到大)输出。,#include #include void main() void sort(char *name,int n); void print(char *name,int n); char *name=Follow me,BASIC,Great Wall,FORTRAN,Computer design; int n=5; sort(name,n); print(name,n); ,void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i0) k=j; if(k!=i) temp=nam

20、ei; namei=namek; namek=temp; ,void print(char *name,int n) int i; for(i=0;in;i+) printf(%sn,namei); ,运行结果为: Computer design FORTRAN Follow me Great Wall,10.7.2 指向指针的指针,定义一个指向指针数据的指针变量: *; 根据“ * ”运算符的结合性,*相当于*(*) *是指针变量的定义形式,定义了一个指向字符数据的指针变量。 前面又有一个*号:表示指针变量是指向一个字符指针变量的。*就是所指向的另一个指针变量。,例10.7 使用指向指针的指针。,#include void main() char *name=Follow me,BASIC,Great Wall,FORTRAN,Computer design; char *; int ; for(;) ; printf(,*); ,例10.28 一个指针数组的元素指向整型数据的简单例子。,#include void main() int ,; int *num5= printf(%sn,*argv); -argc; ,在DOS命令状态下输入的命令行为 则执行以上命令行将会输出以下信息: ,10.8有关指针的数据类型和 指针运算的小结,10.8.1有关指针的数据类

温馨提示

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

评论

0/150

提交评论