• 指针系统学习4-字符串与指针


    1.字符串与指针

    (1) 用字符数组存放一个字符串,然后输出该字符串。

      例题一:定义一个字符数组,对它初始化,然后输出该字符串。

    #include <stdio.h>
    
    void main()
    {
          char string[] = "I love Fishc.com!";
          
          printf("%s
    ", string);
    }

     (2) 用字符指针指向一个字符串

      例题二:可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。

    #include <stdio.h>
    
    void main()
    {
          char *string = "I love Fishc.com!";
          
          printf("%s
    ", string);
    }

    2.字符串中字符的存取方法

    对字符串中字符的存取,可以用下标方法,也可以用指针方法!

    1. 下标法举例:将字符串a复制为字符串b
      #include <stdio.h>
      
      void main()
      {
            char a[] = "Fishc.com is a good web site!", b[40];
            int i;
            
            for(i=0; *(a+i) != ''; i++)
            {
                  *(b+i) = *(a+i);
            }
            *(b+i) = '';
      
            printf("String a is: %s
      ", a);
            printf("String b is: ");
            for(i=0; b[i] != ''; i++)
            {
                  printf("%c", b[i]);
            }
            
            printf("
      
      ");
      }
      View Code
    2. 指针方法举例:将字符串a复制为字符串b
      #include <stdio.h>
      
      void main()
      {
            char a[] = "Fishc.com is a good web site!", b[40], *p1, *p2;
            int i;
            
            p1 = a;
            p2 = b;
            
            for( ; *p1 != ''; p1++, p2++)
            {
                  *p2 = *p1;
            }
            *p2 = '';
      
            printf("String a is: %s
      ", a);
            printf("String b is: ");
            for(i=0; b[i] != ''; i++)
            {
                  printf("%c", b[i]);
            }
      
            printf("
      ");
      }
      View Code

    例题:用函数调用实现字符串的复制

    1. 用字符数组作参数
      #include <stdio.h>
      
      void  main()
      {
            void  copy_string(char from[], char to[]);
      
            char a[] = "I am a teacher.";
            char b[] = "You are a student.";
            
            printf("string a = %s
      string b = %s
      ", a, b);
            printf("copy string a to string b:
       ");
      
            copy_string(a, b);
            
            printf("
      string a = %s
      string b = %s
      ", a, b);
      }
      
      void  copy_string(char from[], char to[])
      {
            int i = 0;
      
            while( from[i] != '' )
            {
                  to[i] = from[i];
                  i++;
            }
            to[i] = '';
      }
      View Code
    2. 形参用字符指针变量
       1 #include <stdio.h>
       2 
       3 void  main()
       4 {
       5       void copy_string( char *from, char *to );
       6 
       7       char *a = "I am a teacher.";
       8       char *b = "You are a student.";//此处应该定义为char b[] = "You are a student.";
       9       //错误原因是b的内容为常量,*b只是对地址进行偏移,而不能覆盖
      10       
      11       printf("String a = %s
      String b = %s
      ", a, b);
      12       printf("copy string a to string b:
      ");
      13 
      14       copy_string(a, b);
      15  
      16       printf("
      String a = %s
      String b = %s
      ", a, b);
      17 }
      18 
      19 void  copy_string( char *from, char *to )
      20 {
      21       for( ; *from != ''; from++,to++)
      22       {
      23             *to = *from;
      24       }
      25 
      26       *to = '';
      27 }
      28 
      29 //丫的,内存出错了,该内存不能被写,为什么? WHY??见第8,9行
      View Code

      具体解释:五大内存分区
      在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
      栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。
      堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
      自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
      全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
      常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在《const的思考》一文中,我给出了6种方法) 

    优化:对 copy_string 函数还可作简化

    • 方法一:
      #include <stdio.h>
      
      void  main()
      {
            void copy_string( char *from, char *to );
      
            char *a = "I am a teacher.";
            char b[] = "You are a student.";
      
            printf("String a = %s
      String b = %s
      ", a, b);
            printf("copy string a to string b:
      ");
      
            copy_string(a, b);
       
            printf("
      String a = %s
      String b = %s
      ", a, b);
      }
      
      void  copy_string( char *from, char *to )
      {
            while( (*to = *from) != '' )
            {
                  to++;
                  from++;
            }
      }
      View Code
    • 方法二:
      #include <stdio.h>
      
      void  main()
      {
            void copy_string( char *from, char *to );
      
            char *a = "I am a teacher.";
            char b[] = "You are a student.";
      
            printf("String a = %s
      String b = %s
      ", a, b);
            printf("copy string a to string b:
      ");
      
            copy_string(a, b);
       
            printf("
      String a = %s
      String b = %s
      ", a, b);
      }
      
      void  copy_string( char *from, char *to )
      {
            while( (*to++ = *from++) != '')//指针运算符优先级高于++
            {
                  ;
            }
      }
      View Code
    • 方法三:
      #include <stdio.h>
      
      void  main()
      {
            void copy_string( char *from, char *to );
      
            char *a = "I am a teacher.";
            char b[] = "You are a student.";
      
            printf("String a = %s
      String b = %s
      ", a, b);
            printf("copy string a to string b:
      ");
      
            copy_string(a, b);
       
            printf("
      String a = %s
      String b = %s
      ", a, b);
      }
      
      void  copy_string( char *from, char *to )
      {
            while( *from != '' )
            {
                  *to++ = *from++;
            }
            *to = '';
      }
      View Code
    • 方法四:
      #include <stdio.h>
      
      void  main()
      {
            void copy_string( char *from, char *to );
      
            char *a = "I am a teacher.";
            char b[] = "You are a student.";
      
            printf("String a = %s
      String b = %s
      ", a, b);
            printf("copy string a to string b:
      ");
      
            copy_string(a, b);
       
            printf("
      String a = %s
      String b = %s
      ", a, b);
      }
      
      void  copy_string( char *from, char *to )
      {
            while( *to++ = *from++ )
            {
                  ;    // '' == 0
            }
      }
      View Code
    • 方法五:
      #include <stdio.h>
      
      void  main()
      {
            void copy_string( char *from, char *to );
      
            char *a = "I am a teacher.";
            char b[] = "You are a student.";
      
            printf("String a = %s
      String b = %s
      ", a, b);
            printf("copy string a to string b:
      ");
      
            copy_string(a, b);
       
            printf("
      String a = %s
      String b = %s
      ", a, b);
      }
      
      void  copy_string( char *from, char *to )
      {
            for( ; *to++ = *from++; )
            {
                  ;
            }
      }
      View Code
    • 方法六:
      #include <stdio.h>
      
      void  main()
      {
            void copy_string( char *from, char *to );
      
            char *a = "I am a teacher.";
            char b[] = "You are a student.";
      
            printf("String a = %s
      String b = %s
      ", a, b);
            printf("copy string a to string b:
      ");
      
            copy_string(a, b);
       
            printf("
      String a = %s
      String b = %s
      ", a, b);
      }
      
      void  copy_string( char from[], char to[] )
      {
            char *p1, *p2;
            
            p1 = from;
            p2 = to;
      
            while( (*p2++ = *p1++) != '' )
            {
                  ;
            }
      }
      View Code
  • 相关阅读:
    Windows Server 2008关闭internet explorer增强的安全配置
    【转载并整理】mysql分页方法
    Mysql:MyIsam和InnoDB的区别
    【转载】web网站css,js更新后客户浏览器缓存问题,需要刷新才能正常展示的解决办法
    【转载】java前后端 动静分离,JavaWeb项目为什么我们要放弃jsp?
    Redis命令汇总
    Redis介绍及安装
    【转载】Spring Cache介绍
    简单示例:Spring4 整合 单个Redis服务
    【转载整理】Hibernater的锁机制
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/10046433.html
Copyright © 2020-2023  润新知