1、指针数组赋值与初始化,char name59=“gain”,“much”,“stronger”, “point”,“bye”;,char *name5=“gain”,“much”,“stronger”, “point”,“bye”;,二维数组与指针数组区别:,二维数组存储空间固定字符指针数组相当于可变列长的二维数组,指针数组元素的作用相当于二维数组的行名 但指针数组中元素是指针变量二维数组的行名是地址常量,void main() void sort(char *name , int n);void print(char *name , int n);char *name =“Follow me
2、“,“BASIC“, “Great Wall“,“FORTRAN“,“Computer “;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=namei; namei=namek; namek=temp; ,i=0,例 对字符串排序(简单选择排序),例 对字符串排序(简单选择排序),void main() void sort(char *name , int n), print(char *name ,
3、int n);char *name =“Follow me“,“BASIC“, “Great Wall“, “FORTRAN“,“Computer “;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=namei; namei=namek; namek=temp; ,name0,name1,name2,name3,name4,name,Great Wall,FORTRAN,Computer,Follow me
4、,BASIC,i=1,例 对字符串排序(简单选择排序),void main() void sort(char *name , int n), print(char *name , int n);char *name =“Follow me“,“BASIC“, “Great Wall“, “FORTRAN“,“Computer “;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=namei; namei=n
5、amek; namek=temp; ,name0,name1,name2,name3,name4,name,Great Wall,FORTRAN,Computer,Follow me,BASIC,i=2,例 对字符串排序(简单选择排序),void main( ) void sort(char *name , int n), print(char *name , int n);char *name =“Follow me“,“BASIC“, “Great Wall“, “FORTRAN“,“Computer “;int n=5;sort(name, n);print(name, n); void
6、 sort(char *name ,int n) char *temp;int i, j, k;for(i=0;i0) k=j;if(k!=i) temp=namei; namei=namek; namek=temp; ,name0,name1,name2,name3,name4,name,Great Wall,FORTRAN,Computer,Follow me,BASIC,i=3,例 对字符串排序(简单选择排序),void main() void sort(char *name , int n);void print(char *name , int n);char *name =“Fol
7、low me“,“BASIC“, “Great Wall“, “FORTRAN“,“Computer “;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=namei; namei=namek; namek=temp; ,name0,name1,name2,name3,name4,name,Great Wall,FORTRAN,Computer,Follow me,BASIC,#include “str
8、ing.h“ void main( ) void sort (char *name , int n );void print (char *name , int n );static char *name = “CHINA“, “AMERICA“,“AUSTRALIA“, “FRANCE“, “GERMAN “ ;int n=5;sort(name, n);print(name, n); ,【例】输入5个国名并按字母顺序排列后输出。,void sort(char *name , int n) char *pt;int i, j, k;for(i=0; i0) k=j;if( k!=i ) pt
9、=namei;namei=namek;namek=pt; void print(char *name , int n) int i;for (i=0; in; i+) printf(“%sn“, namei); ,说明:在以前的例子中采用了普通的排序方法,逐个比较之后交换字符串的位置。交换字符串的物理位置是通过字符串复制函数完成的。反复的交换将使程序执行的速度很慢,同时由于各字符串(国名)的长度不同,又增加了存储管理的负担。用指针数组能很好地解决这些问题。把所有的字符串存放在一个数组中,把这些字符数组的首地址放在一个指针数组中,当需要交换两个字符串时,只须交换指针数组相应两元素的内容(地址)即
10、可,而不必交换字符串本身。,程序定义了两个函数,一个名为 sort完成排序,其形参为指针数组 name,即为待排序的各字符串数组的指针。形参n为字符串的个数。另一个函数名为 print,用于排序后字符串的输出,其形参与 sort的形参相同。主函数main中,定义了指针数组name 并作了初始化赋值。然后分别调用 sort函数和 print函数完成排序和输出。值得说明的是在sort函数中,对两个字符串比较,采用了strcmp函数,strcmp函数允许参与比较的字符串以指针方式出现。namek 和namej 均为指针,因此是合法的。字符串比较后需要交换时,只交换指针数组元素的值,而不交换具体的字符
11、串,这样将大大减少时间的开销,提高了运行效率。,第八节 有关指针的数据类型和指针运算的小结,有关指针的数据类型的小结,二、指针运算小结1、指针变量加/减运算p+、p -、p+i、p-i、p+=i、p-=i加1表示指向下一个数据。,一个指针变量加(减)一个整数并不是简单地将原值加(减)一个整数, 而是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数加(减)。,2、指针变量赋值 p = 指针p2的值赋给指针p1,即p1、p2所指的数据相同,注意:1)不能把一个整型变量赋给指针变量。如:p = 1000;只能将变量已分配的地址赋给指针变量。2)不能把指针变量的值赋给一个整型变量。
12、如:int i; i = p;3、指针变量可以有空值,即该指针不指向任何变量表示如下:p = NULL; /*p不指向任何数据*/在stdio.h中,NULL被定义为0:#define NULL 0,思考:能够赋给指针的唯一整数是,0,习惯上,不使用 p = 0,而使用 p = NULL。 指针变量p可以与NULL作比较,例: if (p = NULL) . 注意:空指针不指向任何数据,与p未赋值不同。当p未赋值时,其值是不确定的,而空指针的值是确定数0。4、指针变量相减。 当p1、p2指向同一个数组的元素,指针相假p2-p1等于p1、p2间的元素个数。 注意:指针相加无意义。,5、两个指针的比较 当p1、p2指向同一个数组的元素时,可以比较,如:p1 p2;若p1、p2不是指向同一个数组的元素,比较无意义。,三、空类型指针 void void *p,表示p是空类型指针,不指定它是指向哪一种类型数据的,即它可以指向任何数据类型。空类型指针与其他类型指针之间赋值时,应进行强制类型转换。例如: char *p1; void *p2;p1 = (char *)p2; p2 = (void *)p1;,