《C语言程序设计编程_C语言学习课件10指针》由会员分享,可在线阅读,更多相关《C语言程序设计编程_C语言学习课件10指针(109页珍藏版)》请在金锄头文库上搜索。
1、第十章l 主要内容主要内容 10.1 10.1地址和指针的概念地址和指针的概念 10.10.变量的指针和指向变量的变量的指针和指向变量的 指针变量指针变量 10.10.数组与指针数组与指针 10.10.字符串与指针字符串与指针 10.10.指向函数的指针指向函数的指针 10.10.返回指针值的函数返回指针值的函数 10.10.指针数组和指向指针的指针指针数组和指向指针的指针 10.810.8有关指针的数据类型和指针运算的小结有关指针的数据类型和指针运算的小结 10.1地址和指针的概念内存区的每一个字节有一个编号,这就是“地址地址” 。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这
2、个变量分配内存单元。 .按变量地址存取变量值的方式称为“直接访问直接访问”方式 (,); (,); ; 2. 另一种存取变量值的方式称为“间接访问间接访问”的方式。即,将变量的地址存放在另一个变量中。在语言中,指针是一种特殊的变量,它是在语言中,指针是一种特殊的变量,它是存放地址的。存放地址的。一个变量的地址称为该变量的“指针指针”。例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量指针变量”。上述的i_pointer就是一个指针变量。指针和指针变量的定义:指针和指针变量的定义: 10.2 变量的指针和指向变量的指 针变量10.10.1 .1
3、 定义一个指针变量定义一个指针变量定义指针变量的一般形式为基类型基类型 *指针变量名;指针变量名;下面都是合法的定义:float *pointer_; char *pointer_; 可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。例如:例如:pointer_;pointer_;在定义指针变量时要注意两点:在定义指针变量时要注意两点:(1)指针变量前面的“*”,表示该变量的类型为指针型变量。例: float *pointer_1;指针变量名是pointer_1 ,而不是* pointer_1 。 (2) 在定义指针变量时必须指定基类型。需要特别注意的是,只有整型变量的
4、地址才能放到指向整型变量的指针变量中。下面的赋值是错误的 float a; int * pointer_1; pointer_1=&a; 10.2.2 10.2.2 指针变量的引用指针变量的引用 注意注意:指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。 例例10. 通过指针变量访问整型变量通过指针变量访问整型变量#include voidmain ( ) int ,; int *pointer_, *pointer_; ; pointer_; /*把变量的地址赋给 pointer_1 */ pointer_; /*把变量的地址赋给 pointer
5、_ */printf(%,%,);printf(%,%,*pointer_, *pointer_); 对对“”和和“* *”运算符说明:运算符说明:如果已执行了语句 pointer_;(1)* pointer_的含义是什么?的含义是什么? “”和“*”两个运算符的优先级别相同,但按自右而左方向结合。因此,* pointer_与相同,即变量a的地址。 如果有pointer_2 * pointer_ ;它的作用是将(的地址)赋给pointer_2 ,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。(2) *的含义是什么?的含义是什么? 先进行运算,得的地址,再进行*运算。*
6、和*pointer_的作用是一样的,它们都等价于变量。即*与等价。(3) (*pointer_)相当于。)相当于。例例10 . 2 输入和两个整数,按先大后小的顺序输出输入和两个整数,按先大后小的顺序输出 和。和。#include void main() int *1,*2,*,; scanf(,);1; if();printf(=,=,); printf(max=,min=,*1,*2); 运行情况如下:运行情况如下:,当输入,时,由于,当输入,时,由于,将和交换。交换前的情况见图将和交换。交换前的情况见图(),交换后见图()。(),交换后见图()。10.10.3 .3 指针变量作为函数参数
7、指针变量作为函数参数例例10 . 3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出 #include void main()void swap(int *,int *);int ,;int *pointer_,*pointer_; scanf(,);pointer_ ; pointer_2 ; if(swap( pointer_ , pointer_2 );printf(,); void swap(int *,int *) int temp; temp*1; *; *temp; 例例10. 输入、输入、 3个整数,按大小顺序输出。个整数,按大小顺序输出。#include voi
8、d main() void exchange(int *1, int *2, int *3); int ,*,*,*; scanf(%,%,%,&, &, &); exchange (,); printf(,); void exchange(int *, int *, int *) void swap(int *, int *); if(*) swap(,); if(*) swap(,); if(* swap(,); void swap(int *, int *) int temp; temp*; *; *temp; 10.3 数组与指针 一个变量有地址,一个数组包含若干元素,每个数组元素都在
9、内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元数组元素的指针就是数组元素的地址素的地址。 定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。例如:例如: ; (定义为包含个整型数据的数组) *; (定义为指向整型变量的指针变量)应当注意,如果数组为型,则指针变量的基类型亦应为型。 10.3.1 10.3.1 指向数组元素的指针指向数组元素的指针对该指针变量赋值:对该指针变量赋值:;把元素的地址赋给指针变量。也就是使指向数组的第号元素,如图:10.10. .通过指
10、针引用数组元素通过指针引用数组元素引用一个数组元素,可以用:()() 下标法,如形式;下标法,如形式;()() 指针法,如指针法,如*()或()或*()()。其中是数组名,是指向数组元素的指针变量,其初值。例例10.5 输出数组中的全部元素。输出数组中的全部元素。 假设有一个数组,整型,有个元素。要输出各元素的值有三种方法: (1)下标法。下标法。#include void main() int ; int;for(;)scanf(,); printf();for(;)printf(,); (2) 通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。#inclu
11、de voidmain() int ; int ;for(; )scanf(,);printf(); for(;) printf(,*(); (3) 用指针变量指向数组元素。用指针变量指向数组元素。#include void main() int ; int *,; for(;) scanf(,); printf(); for(;();) printf( ,*); 例例10. 通过指针变量输出数组的个元素。通过指针变量输出数组的个元素。 #include void main() int*,;for(; )scanf(,); printf(); for(;, ) printf(,*);程序运行情
12、况:程序运行情况:1 2 3 4 5 6 7 8 9 022153 234 0 0 30036 25202 11631 8259 8237 28483显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值 #include void main() int*,;for(;)scanf(,); printg(); p=a; for(;, ) printf(,*);10.10.3 .3 用数组名作函数参数用数组名作函数参数在第在第8章章8.7节中介绍过可以用数组名作函数的参数节中介绍过可以用数组名作函数的参数如: void main() i(int arr,int ); int a
13、rray; (array,); void (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
14、(;) ;temp; ; temp; return; 运行情况如下:运行情况如下:The original array:,The array has been inverted:,#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 ();对刚才的程序可以作一些改动。将对刚才的程序
15、可以作一些改动。将函数函数inv中的形参改成指针变量。中的形参改成指针变量。 void inv(int *,int ) /*形参x为指针变量*/int,temp,*,*,(); ; for(;,) emp*;*;*temp;return;如果有一个实参数组,想在函数中改变此数如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有组中的元素的值,实参与形参的对应关系有以下种情况:以下种情况: (1) 形参和实参都用数组名,如:形参和实参都用数组名,如:void main() void (int ,int ) int ; (,); (2) 实参用数组名,形参用指针变量。如:实
16、参用数组名,形参用指针变量。如: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(;
17、,)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 ,int ); int*,10; ; for(;) scanf(,);
18、 ; sort(,); for(,;)(,*);void sort(int ,int ) int ,; for(;);for(;)() ; (!); ; ; 10.3.4 10.3.4 多维数组与指针多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。 1. 1. 多维数组元素的地址多维数组元素的地址先回顾一下多维数组的性质,可以认为二维数组是“数组的数组”,例 :定义定义int a34=1,3,5,7,;则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为 ,则表表 示示 形形 式式含义含义
19、地地 址址a 二维数组名,指向一维数组a0,即0行首地址2000a0,*(a+0),*a0行0列元素地址2000a+1,&a11行首地址2008a1,*(a+1)1行0列元素a10的地址2008A1+2,*(a+1)+2,&a121行2列元素a12 的地址2012*(a1+2),*(*(a+1)+2),a121行2列元素a12的值元素值为13例例10.0 输出二维数组有关的值输出二维数组有关的值 #include define FROMAT,void main() int 341,3,5,7,9, ,; printf(,*); printf(,0 , *();printf(,0,00);pri
20、ntf(,1,);printf(,10,*(+)+);printf(,*();printf(,); printf(,*(*( ); 某一次运行结果如下:某一次运行结果如下:, (0行首地址和0行0列元素地址), (0行0列元素地址), (0行0首地址和0行0列元素地址), (1行0列元素地址和1行首地址), (1行0列元素地址), (2行0列元素地址), (2行首地址), (1行0列元素的值)2 . 2 . 指向多维数组元素的指针变量指向多维数组元素的指针变量(1) 指向数组元素的指针变量指向数组元素的指针变量例例10.11 10.11 用指针变量输出二维数组元素的值用指针变量输出二维数组元素
21、的值 #include void main() int 341,3,5,7,9,11,13,15,17,19,21,23; int*; for(;) () printf(); printf(,*); 运行结果如下:运行结果如下:1 3 5 7 9 11 13 1519 21 23 (2) 指向由个元素组成的一维数组的指针变量指向由个元素组成的一维数组的指针变量例例10.13 10.13 出二维数组任一行任一列元素的值出二维数组任一行任一列元素的值#include void main ( ) int 1,3,5,7,9,11, 13,15,;int (*),; ;scanf( ,); print
22、f(, ,*(*(); 运行情况如下:,(本行为键盘输入),3. 用指向数组的指针作函数参数用指向数组的指针作函数参数例10.13 有一个班,个学生,各学门课,计算总平均分数以及第个学生的成绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数average求总平均成绩,用函数search找出并输出第个学生的成绩。#include void main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60,80, 87,90,81,90,99,1
23、00,98; average(*score,12);*求12个分数的平均分*search(score,);*求序号为的学生的成绩*void average(float *,int ) float*_; float sum,aver; p_end; for(;_;) sumsum(*); aversum; printf(average,aver);void search(float (*)4,int ) / * p是指向具有4个元素的一维数组的指针 */int ; printf(the score of No. % are:,); for(;) printf(5.2,*(*(); 程序运行结果如
24、下:程序运行结果如下:averageThe score of No.2 are:.例例10.4 在上题基础上,查找有一门以上课程不及格的在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。学生,打印出他们的全部课程的成绩。 #include void main()void search(float (*p)4,int n);/*函数声明*/ float score34=65,57,70,60,58,87, 90,81,90,99,100,98; search(score,);void search(float (*p)4,int )int ,; for(;) flag;
25、for(;) if(*(*())flag; if() printf(No.%d fails,his scores are:n,j+1); for(;) printf(%.,*(*(); printf(); 程序运行结果如下:No.1 fails, his scores are:. . . .No.2 fails, his scores are:. . . . 10. 字符串与指针10.4.10.4.字符串的表示形式字符串的表示形式 例例 10.5 定义一个字符数组,对它初始化,定义一个字符数组,对它初始化, 然后输出该字符串然后输出该字符串 #include void main()char s
26、tringI love China!; printf(,string); (1) 用字符数组存放一个字符串,然后输出该字符串。用字符数组存放一个字符串,然后输出该字符串。(2) 用字符指针指向一个字符串。用字符指针指向一个字符串。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。 例例106 定义字符指针定义字符指针#include void main()charstring I love China!;printf(,);例例10.10.7 7 将字符串复制为字符串。将字符串复制为字符串。 #include void ()char am a boy,20; int ; f
27、or(;*()!;) *()*(); *(); printf(string a is :,); printf(string b is:); for(;!;) printf(,); printf(); 也可以设指针变量,用它的值的改变来指向字符串中的不同的字符。 例例10.8 用指针变量来处理例用指针变量来处理例107问题。问题。#include void main() char =I am a boy. ,20,*p1,*p2; int ; ; for(;*!;p1,p2)*;*;printf(string is:,); printf( :);for(;!;) printf(,); print
28、f();程序必须保证使和同步移动程序必须保证使和同步移动 10.4.2 10.4.2 字符指针作函数参数字符指针作函数参数例例10.19 用函数调用实现字符串的复制用函数调用实现字符串的复制 #include void main() void copy_string(char from , char to ); char a = am a teacher; char =you are a student; printf(“string a= string , ,); printf(“copy string a to string b:n ”); copy_string (,); printf(
29、nstring a=%snstring b=%sn,a,b); (1) 用字符数组作参数用字符数组作参数void copy_string(char from , char to ) int ; while(from!)tofrom;to; 程序运行结果如下程序运行结果如下: string aI am a teacher string b you are a student copy string a to string b:string a I am a teacherstringI am a teacher(2) 形参用字符指针变量形参用字符指针变量 #include void main()
30、 void copy_string(char * from, char *); char * am a teacher .; char *you are a student ; printf(string a=string ,); printf(copy string a to string b:n ); _(,);printf(nstring a=%snstring b=%sn,a,b); void copy_string(char *,char *) for(;*from!;from,to)*tofrom;*to; (3) (3) 对对copy string 函数还可作简化函数还可作简化
31、1、将、将copy_string函数改写为函数改写为void copy_string (char *from,char *) while(*from)!) to;from; copy_string函数的函数体还可改为函数的函数体还可改为 while(*to*from)!); copy_string函数的函数体还可写成函数的函数体还可写成 while(*from!)*to*from; *to; 上面的上面的while语句还可以进一步简化为下面的语句还可以进一步简化为下面的while语语句:句:while(*to*from);它与下面语句等价:while(*to*from)!);将*from赋给*
32、to,如果赋值后的*to值等于则循环终止(已赋给*to) 函数体中函数体中while语句也可以改用语句也可以改用for语句:语句:for(;(*to*from)!;);或for(;*to*from;);也可用指针变量,函数也可用指针变量,函数copy_string可写为可写为void copy_string (char from ,char )char*,*; from;while(*p2*p1)!);(1) 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。(2)赋值方式。对字符数组只能对各个元素赋值,不
33、 能用以下办法对字符数组赋值。 char str; strI love China!; 而对字符指针变量,可以采用下面方法赋值: char*; I love China!; 10.4.3 10.4.3 对使用字符指针变量和字符数组的讨论对使用字符指针变量和字符数组的讨论字符数组和字符指针变量二者之间的区别:字符数组和字符指针变量二者之间的区别:(3)对字符指针变量赋初值: char * love China!;等价于 char*; I love Chian!; 而对数组的初始化: char str love China!; 不能等价于 char str; str I love China!;(
34、4) 定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址。 例如例如: : char str; scanf(,str););(5) 指针变量的值是可以改变的,例如:例例10.0改变指针变量的值改变指针变量的值#include void ()char*I love China!; ; printf(,); #include voidmain()char* love hina!; int ; printf ( “ The sixth character is %cn,a5); for(;!;) printf
35、(,); 若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。例如例如: 10.10. 指向函数的指针指向函数的指针10.5.1 10.5.1 用函数指针变量调用函数用函数指针变量调用函数用指针变量可以指向一个函数。函数在编译时被分配给一个入口地址。这个函数的入口地址就称为函数的指针函数的指针。 #include voidmain() int max(int,int); int ,;scanf(,); (,);printf(, ,); int max(int ,int ) int ; if();else ; return(); 将 main 函数改写为
36、#include voidmain() int (int,int); int (*)(); int ,; ; scanf(,); (*)(,); printf(, ,); 10.5.2 10.5.2 用指向函数的指针作函数参数用指向函数的指针作函数参数 函数指针变量常用的用途之一是把指针作为参数传递到其他函数。指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。 实参函数名 f1 void (int (*x1)(int),int (*x2)(int,int)) int ,; (*)(); *调用函数* (*)(,);*调用函数* 例例10.10.3 3
37、设一个函数设一个函数processprocess,在调用它的时候,每次,在调用它的时候,每次实现不同的功能。输入和两个数,第一次调用实现不同的功能。输入和两个数,第一次调用processprocess时找出和中大者,第二次找出其中小者,时找出和中大者,第二次找出其中小者,第三次求与之和。第三次求与之和。 #include void main() int max(int,int); /* 函数声明 */ int min(int,int); /* 函数声明 */ int add(int,int); /* 函数声明 */ void process (int , int , int(*fun)();
38、/* 函数声明 */ int ,; printf(enter a and b:); scanf(,);printf(max); process(,);printf(min);process(,);printf(sum);process(,);int max(int ,int ) /* 函数定义 */int ; if(); else ; return();int min(int ,int ) /* 函数定义 */ int ; if();else ;return(); int (int ,int ) /* 函数定义 */ int; ; return();void process(int ,int
39、,int (*fun)(int,int) int result; result(*fun)(,); printf(, result);10.10. 返回指针值的函数返回指针值的函数一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。这种带回指针值的函数,一般定义形式为类型名类型名 *函数名(参数表列)函数名(参数表列);例如:int *(int ,int );例例10104 4 有若干个学生的成绩(每个学生有门课程有若干个学生的成绩(每个学生有门课程),要求在用户输入学生序号以后,能输出该学生的全),要求在用户输入学
40、生序号以后,能输出该学生的全部成绩。用指针函数来实现。部成绩。用指针函数来实现。 #include void main()float *score 4=60,70,80,90, 56,89,67,88,34,78,90,66; float*search(float (*pointer)4,int n); float*; int ,; printf(enter the number of student:); scanf(,); printf(The scores of No are:,); search(,);for(;printf(,*(); float * search(float (*)
41、4,int ) float *; *(); return(); 运行情况如下:运行情况如下:enter the number of student:The scores of No. are:56.00 89.00 67.00 88.00例例10.5 对上例中的学生,找出其中有不及格课对上例中的学生,找出其中有不及格课程的学生及其学生号。程的学生及其学生号。#include void main()float score 4=60,70,80,90,56, 89,67,88,34,78,90,66; float search(float (*pointer)4); float*; i ,; fo
42、r(;)search(score );(*(score)printf(scores:,); for(;) printf(5.2,*(); printf(); 10.7 10.7 指针数组和指向指针的指针指针数组和指向指针的指针10.7.1 10.7.1 指针数组的概念指针数组的概念一个数组,若其元素均为指针类型数据,称为指针指针数组数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为一维指针数组的定义形式为: :类型名类型名数组名数组长度;数组名数组长度;例如:例如:*;例例10.6 将若干字符串按字母顺序(由小到大)输出。将若干字符串按字母顺序(由小到大)输出
43、。#include #include void main()void sort(char *name ,int n); void printf(char *name ,int n); char *name =Follow me,BASIC,Great Wall,FORTRAN,Computer design; int ;sort(,); print(,);void sort(char * ,int )char *; int ,; for(; for(; if(strcmp(name,name)0)=; if(!) temp=namei; namei=namek; namek=temp; voi
44、d print(char * ,int ) ; (;) printf(,); 运行结果为:运行结果为:Computer designFORTRANFollow meGreat Wall10.7.2 10.7.2 指向指针的指针指向指针的指针定义一个指向指针数据的指针变量定义一个指向指针数据的指针变量:*;的前面有两个*号。*运算符的结合性是从右到左,因此*相当于*(*),显然*是指针变量的定义形式。如果没有最前面的*,那就是定义了一个指向字符数据的指针变量。现在它前面又有一个*号,表示指针变量是指向一个字符指针变量的。*就是所指向的另一个指针变量。例例10.7 使用指向指针的指针。使用指向指针
45、的指针。 #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=&a0,&a1, &a2,&a3,&a4; int *,; ;for(; printf( ,*); ; 10.7.3 10.7.3 指针数组作指针数组作mainmain函数的形参函数的
46、形参指针数组的一个重要应用是作为main函数的形参。在以往的程序中,main函数的第一行一般写成以下形式:void main()括弧中是空的。main函数可以有参数,例如:例如:void main(int argc,char *argv )。命令行的一般形式为命令名命令名 参数参数 参数参数参数参数例如一个名为file的文件,它包含以下的main函数:void main(int argc,char *argv ) while() argv; printf(,argv); argc; 在DOS命令状态下输入的命令行为则执行以上命令行将会输出以下信息:10.810.8有关指针的数据类型和有关指针的
47、数据类型和指针运算的小结指针运算的小结10.8.110.8.1有关指针的数据类型的小结有关指针的数据类型的小结定定义义含含义义 ;定定义义整型整型变变量量* *;为为指向整型数据的指指向整型数据的指针变针变量量int aint an n; ;定定义义整型数整型数组组,它有个元素,它有个元素 * *;定定义义指指针针数数组组,它由个指向整型数据的指,它由个指向整型数据的指针针元素元素组组成成 (* *););为为指向含个元素的一指向含个元素的一维维数数组组的指的指针变针变量量 ();();为带为带回整型函数回整型函数值值的函数的函数 * *();();为带为带回一个指回一个指针针的函数,的函数,
48、该该指指针针指向整型数据指向整型数据 (* *)();)();为为指向函数的指指向函数的指针针,该该函数返回一个整型函数返回一个整型值值 * *;是一个指是一个指针变针变量,它指向一个指向整型数据的指量,它指向一个指向整型数据的指针变针变量量10.8.2 10.8.2 指针运算小结指针运算小结(1) 指针变量加(减)一个整数指针变量加(减)一个整数例如:、等。(2) 指针变量赋值指针变量赋值将一个变量地址赋给一个指针变量。如:; (将变量的地址赋给)array; (将数组首元素地址赋给)array;(将数组第个元素 的地址赋给)max;(为已定义的函数,将的入口 地址赋给);(和都是指针变量,
49、将的 值赋给) (3) 指针变量可以有空值,即该指针变量不指向任何指针变量可以有空值,即该指针变量不指向任何变量变量。(4) 两个指针变量可以相减两个指针变量可以相减如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数 。(5) 两个指针变量比较两个指针变量比较若两个指针指向同一个数组的元素,则可以进行比较。指向前面的元素的指针变量“小于”指向后面元素的指针变量。 10.8.3 void10.8.3 void指针类型指针类型 ANSIC新标准增加了一种“void”指针类型,即可定义一个指针变量,但不指定它是指向哪一种类型数据的。ANSIC标准规定用动态存储分配函数时返回void指针,它可以用来指向一个抽象的类型的数据,在将它的值赋给另一指针变量时要进行强制类型转换使之适合于被赋值的变量的类型。例如:*;*;( *); 同样可以用( *)将的值转换成 *类型。如:( *);也可以将一个函数定义为 *类型,如: *(char ch1,char ch2)表示函数返回的是一个地址,它指向“空类型”,如需要引用此地址,也需要根据情况对之进行类型转换,如对该函数调用得到的地址要进行以下转换:( *)(h,h);