指針字符串和數組指針

//指針是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);
     }
}  

   
   
    
    
    

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