字符指针与字符串

字符指针与字符串

1、学习目标

  • 字符指针与字符串-掌握
  • 总结与思考

2、字符指针与字符串

  • C语言通过使用字符数组来处理字符串

  • 通常我们把char数据类型的指针变量称为字符指针变量。(数据类型 * 变量名)

  • 字符指针变量与字符数组有着密切关系,它也被用来处理字符串。

  • 初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中。

    • char str[] = “Hello World”;//字符数组中字符串内容是可变的

    • char * p = str;

    • 示例验证:

      #include <stdio.h>
      
      int main()
      {
          char ch = 'A';//字符型的变量
      
          char * p;
      
          p = &ch;//指针指向字符
          printf("%c %c\n", ch, *p);//通过指针找指针的目标是*p
      
          return 0;
      }
      

      运行结果:关于字符指针最基本的程序

      $ ./app
      A A
      

      字符数组存储字符串//char str[] = “Hello World”;

      #include <stdio.h>
      
      int main()
      {
          char ch1[] = "Hello World!";
          char ch2[] = "Hello World!";
      
          char * p;
      
          p = ch1;//相当于ch1[0]<=> *(ch1+0) <=> p[0]
          printf("%s\n", p); 
      
          p = ch2;
          printf("%s\n", p); 
          return 0;
      }
      

      运行结果:

      ./app
      Hello World!
      Hello World!
      

      修改上面的程序,理解指针操作字符串,判断字符串中第一个字母,由大写转小写,由小写转大写。

      #include <stdio.h>
      #include <ctype.h>
      
      int main()
      {
          char ch1[] = "Hello World!";
          char ch2[] = "Hello World!";
      
          char * p;
      
          p = ch1;
      
          if(isalpha(*p)){
              if(isupper(*p))
                  *p = tolower(*p);
              else
                  *p = toupper(*p);
          }   
          printf("%s %p\n", p, p); 
      
          p = ch2;
          printf("%s %p\n", p, p); 
          return 0;
      }
      

      运行结果:虽然内容相同,但是放在内存不同的位置

      $ ./app
      hello World! 0x7ffc4ec63060
      Hello World! 0x7ffc4ec63070
      
  • 在C语言编程中,当一个字符指针指向一个字符串常量时,不能修改指针指向的对象的值。

    • char * p = “Hello World”;//Hello World是字符串常量,不能修改的

      //指针存储了字符串常量的首地址,不能通过指针来修改代码

    • *p = ‘h’;//错误,字符串常量不能修改

    • 示例验证:

      C语言中关于变量的处理,全局变量、static修饰的变量、字符串常量这三种情况下是放到静态区的,程序结束后才会释放内存。

      #include <stdio.h>
      
      int main()
      {
          char * p1 = "Hello World!";//字符串存放在静态区
          char * p2 = "Hello World!";
      
          printf("&p1=%p %p %s\n", &p1, p1, p1);
          printf("&p2=%p %p %s\n", &p2, p2, p2);
      
          return 0;
      }
      

      运行结果:指针p1,p2都指向字符串常量"Hello World!",存储位置为静态区,不能通过指针进行修改。

      $ ./app
      &p1=0x7fffa948f9d8 0x4006a4 Hello World!
      &p2=0x7fffa948f9e0 0x4006a4 Hello World!
      

      验证:*p = ‘h’;//错误,字符串常量不能修改

      #include <stdio.h>
      
      int main()
      {
          char * p1 = "Hello World!";
          char * p2 = "Hello World!";
      
          * p1 -= 32; 
      
          printf("&p1=%p %p %s\n", &p1, p1, p1);
          printf("&p2=%p %p %s\n", &p2, p2, p2);
      
          return 0;
      }
      

      运行结果:

      ./app
      段错误 (核心已转储)
      

      用strcpy()函数验证字符串常量不能修改。

      #include <stdio.h>
      #include <string.h>
      
      int main()
      {
          char ch[] = "welcome";
          char * p1 = "Hello World!";
      
        //strcpy(ch, p1);(1)
          strcpy(p1, ch);//(2)同样是修改字符串常量
              
          puts(ch);
          puts(p1);
      
          return 0;
      }
      

      运行结果:

      //(1)strcpy(ch, p1);
      $ ./app
      Hello World!
      Hello World!
      
      //(2)strcpy(p1, ch);
      $ ./app
      段错误 (核心已转储)
      

3、程序举例

  • 不利用任何字符串函数,编程实现字符串连接函数的功能。

    #include <stdio.h>
    
    int main()
    {
        char ch[100] = "welcome";
        char * p = "Hello World!", *q;
    
        int i = 0;
    
        q = p;
    
        while(*(ch+i) != '\0')
            i++;
    
        while(*p != '\0'){
            *(ch+i) = *p;
            i++;
            p++;
        }
        *(ch+i) = *p;//让指针p中的\0赋给ch[]中
    
        p = q;
        puts(ch);
        puts(p);
    
        return 0;
    }
    

    运行结果:

    $ ./app
    welcomeHello World!
    Hello World!
    

4、总结与思考

  • 主要介绍了如何用字符指针操作字符串以及字符串常量相关内容。

  • 思考:

    • 字符指针操作字符串有什么注意事项?

      如果是字符串常量,不能修改;不是字符串常量则可以修改。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值