zoukankan      html  css  js  c++  java
  • 《C语言笔记:字符串和字符数组》

    一,C语言使用指针来管理字符串

      1,C语言本身是没有String类型的,C语言中的字符串类型是通过字符指针来间接实现的。

      2,定义字符串的方法:char *p = "hello world";此时的p就叫做字符串,但是实际上p只是一个字符指针(本质上是一个指针,只是p指向了一个字符串的起始地址)。

      3,C语言种字符串的本质:指针指向头,固定尾部的地址相连的一段连续的内存(类似于数组,字符串和字符数组很像)。

      4,C语言中字符串有3个核心要点:第一,用一个指针指向字符串的头;第二,固定尾部(字符串总是以''字符结尾);第三,组成字符串的各个字符彼此地址相连。

      5,''是一个ASCII字符,其实就是编码为0的那个字符(真正的0,和数字0是不同的,数字0的ASCII值是48)。要注意区分 ''   、0 、  '0'。(0等于'',‘0’等于48)。

     1 #include<stdio.h>
     2 #include<string.h>
     3 
     4 int main(void)
     5 {
     6     char a[10] = {0};
     7 
     8     printf(" a[4] = %c 
    ",a[4]);    //显示为空什么都没有,也就是''字符
     9     printf(" a[4] = %d 
    ",a[4]);     //显示0,字符''的十进制数为0
    10     
    11     a[4] = '0';
    12     printf(" a[4] = %c 
    ",a[4]);     //显示0,显示的是字符0
    13     printf(" a[4] = %d 
    ",a[4]);    //显示48,字符0的十进制数为48
    14     a[4] = 48;
    15     printf(" a[4] = %c 
    ",a[4]);     //显示0,显示的是字符0
    16     printf(" a[4] = %d 
    ",a[4]);    //显示48,字符0的十进制数为48
    17     printf(" sizeof(a) = %d 
    ",sizeof(a)); //显示10,数组a所占的总空间
    18     printf(" strlen(a) = %d 
    ",strlen(a));    //显示0,因为数组的第0个元素为字符'',以此便判定了字符串的结束
    19     a[0] = 48;
    20     printf(" strlen(a) = %d 
    ",strlen(a));    //显示1,因为数组的第1个元素为字符'',以此便判定了字符串的结束
    21     a[1] = '0';
    22     printf(" strlen(a) = %d 
    ",strlen(a)); //显示2,因为数组的第2个元素为字符'',以此便判定了字符串的结束
    23 }

    二,字符串指针和字符串本身

      1,指向字符串的指针和字符串本身是分开的两个东西。

      2,比如说char *p = "linux",p本质上是一个字符指针,占四个字节(32位系统),“linux"分配在代码段占6个字节,实际上总共耗费了10个字节。

      3,这10个字节中,4字节的指针p叫做字符串指针,5个字节用来存放linux,这5个字符的内存才是真正的字符串,最后1个字节用来存放''的内存就是字符串的结束标志。

    三,存储多个字符的两种方式:字符串和字符数组

      1,字符数组char a[] = "linux";来说,定义了一个数组a,数组a占6个字节,右值”linux"本身只存在于编译器中,编译器将用它来初始化数组a后丢弃掉,内存中是没有“linux"这个字符串的,这句相当于 char a[] = {‘l','i','n','u','x',''};

      2,字符串char *p = ”linux";定义了一个字符指针p,p占四个字节,分配在栈上,同时定义了一个字符串"linux",分配在代码区;然后把代码段的字符串的首地址赋值给p。

      3,字符数组和字符串有本质的区别。字符数组本身是数组,数组自身自带内存空间,可以用来存放东西;而字符串本质上是一个指针,本身永远只占四个字节,而且这四个字节还不能用来保存有效数据,所以只能把有效数据存到别的地方去,然后把地址存在p中。

      4,总的来说,就是字符数组自己存那些字符;字符串一定需要额外的内存来存那些字符,字符串本身只存真正那些字符所在的内存空间的首地址。 

    #include<stdio.h>
    #include<string.h>
    
    int main(void)
    {
        char a[] = "linux";
        char *p = "linux";
    
        printf("  a[2] = %c  
    ",a[2]); //显示n
        a[2] = 'w';
        printf("  a[2] = %c  
    ",a[2]); //显示w 这个字符数组内存空间在栈区,内容可以修改
        
        printf("  p[2] = %c  
    ",p[2]); //显示n
        //p[2] = 'w';                   // 字符串实际的内存空间是在代码区,其内容不能被修改
        //printf("  p[2] = %c  ",p[2]);
        
    }

    四,sizeof关键字和strlen函数

      1,sizeof是C语言的一个关键字,是一个运算符。用来返回一个类型或者变量所占的内存字节数。

      2,strlen是一个C语言的库函数,这个库函数声明在string.h中,原型是:size_t strlen(const char *s);这个函数接受一个字符串的指针,然后返回这个字符串的长度(字节为单位)。返回的长度是不包含字符串结尾的''的。

      3,sizeof(数组名)得到的永远是这个数组整个的大小,和数组中有无初始化,初始化多少是没有关系的;strlen是计算字符串长度的,只能传递合法的字符串进去才有意义。

  • 相关阅读:
    将戴尔台式机的系统刷成Linux Centos7
    如何在Maven构建的Java项目中使用log4j
    mybatis-generator逆向工程自动生成mapper
    Win10改变系统主题颜色,降低对眼睛的刺激
    09、SpringBoot 整合 jdbcTemplate、Mybatis
    08、SpringBoot配置拦截器
    navicat快捷键
    DevOps:从理念到实施
    活到老学到老啊技术人
    Linux上安装java+tomcat+mysql运行环境
  • 原文地址:https://www.cnblogs.com/xuxianshen/p/13976036.html
Copyright © 2011-2022 走看看