(一)指针数组
指针数组就是每一个元素存放一个地址,相当于一个指针变量。
如:int *p[4]
指针数组比较适合用来指向若干字符串,使得处理字符串更加灵活。
例如,现在要将若干字符串按字母顺序由小到大输出
1 #include<stdio.h> 2 #include<string.h> 3 int main(){ 4 void sort(char *name[],int n); 5 void print(char *name[],int n); 6 char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"}; 7 8 int n=5; 9 sort(name,n); 10 print(name,n); 11 return 0; 12 } 13 14 void sort(char *name[],int n) //对字符串排序 15 { 16 char *temp; 17 int i,j,k; 18 for(i=0;i<n-1;i++){ 19 k=i; 20 for(j=i+1;j<n;j++) 21 if(strcmp(name[k],name[j])>0) k=j; 22 if(k!=i){ 23 temp=name[i];name[i]=name[k];name[k]=temp; //将指向第i个字符串的数组元素的值与指向第k个字符串数组元素的值对换 24 } 25 } 26 } 27 28 void print(char *name[],int n){ //输出字符串 29 int i; 30 for(i=0;i<n;i++) 31 printf("%s ",name[i]); 32 }
通过上例子,试比较
if(strcmp(name[k],name[j])>0)和if(strcmp(*name[k],*name[j])>0)的区别:
if(strcmp(name[k],name[j])>0)是从头到尾一次比较字符串中的元素
而if(strcmp(*name[k],*name[j])>0)只比较指向字符串中的首元素
附:strcmp只是单纯的按照ascii码大小从头到尾比较,而stricmp则不区分大小写
(二)指向指针的指针
指向指针数据的指针变量 char **p;
指针数组的元素可以指向字符串,也可以指向整型数据或者实型数据
指向字符串的小例子
1 #include<stdio.h> 2 int main(){ 3 char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"}; 4 char **p; 5 int i; 6 for(i=0;i<5;i++){ 7 p=name+i; //先使p指向name数组的name[0],*p是name[0]的值,即第一个字符串首字符的地址,依次输出5个字符串 8 printf("%s ",*p); 9 } 10 }
指向整型数据的小例子
1 #include<stdio.h> 2 int main(){ 3 int a[5]={1,3,5,7,9}; 4 int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]}; 5 int **p,i; 6 p=num; 7 for(i=0;i<5;i++){ 8 printf("%d ",**p); //p是&num[0],*p是num[0]的值,即a[0],**p是a[0]的值 9 p++; 10 } 11 }
利用指针变量访问另一变量称为间接访问
指向指针数据的指针用的就是二级间址,说通俗点就是通过两个地址访问一个变量,当通过多个(大于2)地址访问变量时,就称为多重指针
(三)指针数组作main函数形参
带参数的main函数原型:
int main(int argc, char *argv[ ] );
argc和argv是main函数的形参,它们是程序的命令行参数。argc指参数的个数,argv指参数向量,其中每一个元素指向命令行中的一个字符串。
main函数是操作系统调用的,所以实参只能由操作系统给出。在操作命令的状态下,实参是和执行文件的命令一起给出的。命令行中包括命令名和要传给main函数的参数
举个例子, $./echo computer and tom
echo是命令名,computer等是参数,此例子中argc为4,因为命令名也算其中一个参数