《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是计算字符串长度的,只能传递合法的字符串进去才有意义。

原文地址:https://www.cnblogs.com/xuxianshen/p/13976036.html