C的实用笔记33——字符串与字符数组、字符指针

本文介绍了如何从字符数组转换为字符串,包括字符数组的初始化,特别是部分初始化时未定义位置默认为空字符。接着讨论了字符串的定义和特性,如以为结束标志,以及两种初始化字符串的方法。此外,还展示了如何通过数组下标和指针偏移读取字符串中的字符,以及使用%s和puts函数打印字符串。最后,对比了字符数组和字符指针定义字符串的区别,包括可修改性和内存存储位置。
摘要由CSDN通过智能技术生成

1.从字符数组到字符串

1、字符数组的使用:定义、初始化、遍历的方法和int型数组完全一样。如下:

  1. 基本使用:
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char str[] = {'a','b','c','d','e'};
        int i;
        int len = sizeof(str) / sizeof(str[0]);
        for(i=0; i<len; i++){
            printf("*%c* ", str[i]);
        }
        return 0;
    }

  2. 部分初始化时,没有被初始化的位置默认是空字符,也就是转义字符'\0',它的ASCII码是0。
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char str[8] = {'a','b','c','d','e'};		//部分初始化
        int i;
        for(i=0; i<8; i++){
            printf("*%d* ", str[i]);				//打印后发现,后面三个没定义的都显示0
        }
        return 0;
    }

2、用字符数组保存字符串:

  1. 知识点
    1. 啥是字符串?:以双引号包裹的一串字符型常量。比如 "abcde"、"4h\n5\r"、"vhd\053"
    2. 字符串有啥特点?字符串和字符数组的区别?:串中的转义字符'\0'(空字符)是字符串的结束标志。字符串长度包括字符'\0'。
  2. 两种初始化方式
    1. 用字符串给字符数组初始化,系统默认以\0结尾。好方法。
      char str[] = "abcde";	//数组str的长度是6

    2. 用结尾为'\0'的初始化列表给字符数组初始化:必须以\0结尾,否则不知道你是字符串。笨方法。
      char str[] = {'a','b','c','d','e','\0'};	//数组str的长度是6

3、数组下标法读取字符串里的字符:

  1. 基本使用:
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char str[] = "abcde";					//用字符串给字符数组初始化
        int i;
        int len = sizeof(str) / sizeof(str[0]);	
        for(i=0; i<len; i++){
            printf("*%c* ", str[i]);			//数组下标法读取字符串内容
        }
        return 0;
    }

4、直接打印字符串的两种方法:

  1. 用%s占位符打印:
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char str[] = "abcde";
        printf("%s\n", str);		//%s打印字符串
        return 0;
    }

  2. puts函数打印:
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char str[] = "abcde";
        puts(str);					//puts函数打印
        return 0;
    }

  3. 打印碰到空字符'\0'就会停止:阅读以下程序,将来有机会看%s源码,会发现它在找空字符'\0'。
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char str1[] = {'a','b','c','\0','4','4','5'};
        puts(str1);					//结果是abc,因为碰到空字符'\0',就会停止打印
        char str2[] = "abc\0445";
        puts(str2);                 //结果是abc$5,因为\044是以8进制表示的ASCII码
        return 0;
    }

2.定义字符指针指向字符串,指针偏移间接读取字符串里的字符

1、知识点:根据数组名就是数组首地址的规定,我们完全可以定义一个一级字符指针,来指向用字符数组保存的字符串。

2、使用方法:

  1. 通过指针偏移间接读取字符串里的内容:
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char str[] = "abcde";                       //用字符数组存储字符串
        int i;
        int len = sizeof(str) / sizeof(str[0]);     
        char *pstr = str;                           //用字符指针指向字符串
        for(i=0; i<len; i++){
            printf("*%c* ", *(pstr+i));             //用指针偏移的方式读取字符串里的字符   
        }
        return 0;
    }

  2. 通过指针还可以间接打印字符串:
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char str[] = "abcde";                      
        char *pstr = str;                           
        printf("%s\n", pstr);				//%s打印字符串
        puts(pstr);							//puts函数打印字符串
        return 0;
    }

3.用字符指针直接指向字符串

1、知识点:

  1. 字符串本身是一个常量,用字符指针直接指向字符串后,字符指针实际上保存的是字符串常量的首地址,这个首地址的类型是一级字符指针。读下列程序,可能会有点奇怪,但是联系起数组可能稍微理解一点。
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char *str = "abcde";
        printf("0x%p\n", "abcde");			//0x0000000000404000
        printf("0x%p\n", &"abcde");			//0x0000000000404000
        printf("%c\n", *"abcde");			//a
        printf("%c\n", *("abcde"+1));		//b
        printf("0x%p\n", str);				//0x0000000000404000
        return 0;
    }

2、可以通过指针偏移的方式读取字符串里的字符:

  1. 注意点:因为不是字符数组,所以现在不能用sizeof来读取长度。也不允许用sizeof读取字符串长度。
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char *str = "abcde";
        while(*str != '\0'){
            printf("%c ", *str++);			//通过字符指针偏移的方式读取字符串里的字符
        }
        return 0;
    }

3、当然可以通过字符指针打印字符串:

  1.  
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char *str = "abcde";
        printf("%s", str);
        return 0;
    }

4.char str[]="abcde"和char *str = "abcde"的区别(1、2、3的区别)

1、字符串里的字符能否被修改的区别:

  1. char str[] = "abcde"中定义的字符串是一个字符串变量。字符串里的字符允许修改。
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char str[] = "abcde";			//字符串变量允许被修改
        str[0] = 'm';
        printf("%s", str);
        return 0;
    } 

  2. char *str = "abcde" 中定义的字符串是一个字符串常量。字符串里的字符不允许修改。
    #include <stdio.h>
    int main(int argc, char const *argv[])
    {
        char *str = "abcde";  			//字符串常量不允许被修改
        *str = 'm';						//编译可以通过,但是程序运行到第5行会崩,后面也不执行
        printf("%s", str);
        return 0;
    } 

 

2、字符串在内存中存储位置的区别:

  1. char str[] = "abcde"中定义的字符串被存储在栈区。
  2. char *str = "abcde" 中定义的字符串被存储在常量区。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值