指针字符串和数组指针

//指针是C语言的精髓,只有掌握好指针才算是真正学会了C语言,以下就是学习指针的例子
#include<stdio.h>
main()
{
      void sort(char *name[],int n);
      void print(char *name[],int n);
      int strcmp1(char *str1,char *str2);
      int strcmp2(char *str1,char *str2);
      static char *name[]={"CHINW","CHINP","FRANC",
      "FRANCE","GERMANY"};
      int n=5;
      sort(name,n);
      print(name,n);
      if(strcmp1(name[0],name[1])>0)
      printf("%s,%s/n",name[0],name[1]);
      if(strcmp1(name[2],name[3])<0)
      printf("%s,%s/n",name[2],name[3]);
      printf("That is ok!/n");
      getch();
      return 0;
}
int strcmp1(char *str1,char *str2)
{
    char **p1,**p2; //定义两个指向指针的指针的变量,可理解为地址的地址变量
    int f=0;        
    p1=&str1;       //给地址的变量赋待比较的字符串的地址值
    p2=&str2;
    for(;f==0&&(**p1!='/0'||**p2!='/0');(*p1)++,(*p2)++)//循环判断字符串的操作
    {
       if(**p1<**p2)//比较每个字符的大小
       f=-1;
       else if(**p1>**p2)
       f=1;
       else f=0;
    }  
     return f;
}
/*  
本功能是比较字符串大小的函数,该函数运用指针实现,原因是指针可以直接管理内存,
此外减少对存储空间的开销,因为指针之间指向实参,而不用重新为传过来的形参进行
空间的开销。
    现在说明该函数模块的每个语句含义和作用:函数的参数是字符或字符串的指针(地址),
实参可以是数组指针表示的字符串,也可以仅仅是字符串,总的来说都是字符串。一旦传值给
形参的字符串指针变量,该变量指向的是整个字符串的首地址,也可以说是第一个字符的地址,
即指针变量是一个字符的地址。
    根据上面的思路,char **p1,**p2定义了两个指向地址的地址的变量,用于替代传进来的
字符串便于操作,p1=&str1表示把字符串的首地址赋值给指向指针的指针的变量,这下也应该知道
p1表示是地址了。在for语句中出现的**p1!='/0'意思是:取出变量的地址里的值,首先是*(*p1)
括号表示取出变量p1指向的地址值,然后外边的”*“再取出地址对于存储的值,这时是值是字符。
如果只是用*p1='/0'的话,那么它只是表示地址的值,而它的值是不会为空的;但是后面必须用
(*p1)++语句,因为(*p1)表示字符串中的一个字符的地址,括号加上"++"意思指向下一个字符,
如果用P++或*p++语句,那么它只是表示地址值简单的加 1 而已,而不是整型或字符型的一个地址值,
即不表示下一个元素。对于if语句中的意思和**p1!='/0'是一样的。
*/
int strcmp2(char *str1,char *str2)
{
    int f=0;
    for(;f==0&&(*str1!='/0'||*str2!='/0');str1++,str2++)//字符指针变量完成for语句的操作
    {
       if(*str1<*str2)//比较单个字符的大小
       f=-1;
       else if(*str1>*str2)
       f=1;
       else f=0;
    }  
     return f;
}
/*
str1字符指针变量表示字符串的单个字符的地址,后面加上”++"表示指向下一个元素,用下一个地址值
表示。*str1取出地址的值即单个字符。
*/
void sort(char *name[],int n)
{
     int i,j,k;
     char *pt;
     for(i=0;i<n-1;i++)
     {
        k=i;    
        for(j=i+1;j<n;j++)
          if(strcmp2(name[k],name[j])>0)
              k=j;
              if(k!=i)
              {
                pt=name[i];
                name[i]=name[k];
                name[k]=pt;
              }
        }
}
void print(char *name[],int n)
{
     int i;
     char **p;
     char *format;
     format="%s/n";
     for(i=0;i<n;i++)
     {
       p=name+i;
       printf(format,*p);
     }
}  

   
   
    
    
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章