指针字符串和数组指针

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

   
   
    
    
    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值