字符串实质,sizeof & strlen

C语言用指针来管理字符串
  1. char *p=“linux” 此时,p只是一个字符指针(本质上就是一个指针变量,只是p指向了一个字符串的起始地址而已)
  2. C语言中字符串的本质:指针指向头、固定尾部的地址相连的一段内存
  3. 字符串就是一串字符,字符反映在现实中就是文字、符号、数字等人用来表达的字符,反映在编程中字符就是字符类型的变量。C语言中使用ASCII编码对字符进行编码,编码后可以用char型变量来表示一个字符。字符串就是多个字符打包在一起共同组成的
  4. 字符串在内存中就是多个字节连续分布构成的(类似于数组,字符串和字符数组非常像)
  • C语言中字符串有3个核心要点,第一是用一个指针指向字符串开头、第二是固定尾部(总是以’\0’结尾)、第三是各字符彼此相连
  • '\0’是一个ASCII字符,就是编码为0的那个字符(真正的0,不同于数字0,数字0有自己的编码)。不可能被包含在字符串里(魔数)。
指向字符串的指针和字符串本身是分开的两个东西
  • char *p = “linux”; 在这段代码中,p本质上是一个字符指针,占4个字节。“linux"分配在代码段,占6个字节。实际上共耗费了10个字节:4字节的指针p叫做字符串指针,5字节的用来存linux这5个字符的内存才是真正的字符串,最后一个用来存”\0"的内存是字符串结尾标志
  • 存储多个字符的2种方式:字符串和字符数组
字符串初始化与sizeof、strlen
  1. sizeof是C语言的一个关键字,也是C语言的一个运算符,sizeof运算符用来返回一个类型或是变量所占用内存字节数。要sizeof的原因是int、double等原生类型占几个字节和平台有关。二是C语言中除了ADT之外还有UDT,这些用户自定义类型占几个字节无法一眼看出,所以用sizeof运算符里让编译器帮忙计算
  2. strlen是一个C语言库函数,这个库函数原型是:size_t strlen(const char *s);函数接受一个字符串的指针,返回这个字符串的长度(以字节为单位)。strlen返回的字符串长度是不包含字符串结尾的’\0’的。从字符串的定义(指向头、固定结尾、中间依次相连)可以看出无法直接得到字符串的长度,所以需要strlen函数来计算得到字符串长度。
    • sizeof(数组名)得到的永远是数组的大小,和数组中有无初始化,初始化为什么无关
    • strlen()是用来计算字符串的长度,只能传递合法的字符串才有意义,如果随便传递一个字符指针,但是这个指针并不是字符串没有任何意义
  3. 当我们定义数组时如果没有明确给出数组大小,则必须同时给出初始化式,编译器会根据初始化式去自动计算数组的大小(数组定义时必须给出大小,要么直接给、要么初始化)
    • char *p=“linux”; sizeof§得到的永远是8(64位操作系统),因为这时候sizeof测的是字符指针p本身的长度,和字符串的长度是无关的
    • strlen刚好用来计算字符串的长度
  4. 字符数组char a[]=“linux”; 来说,定义了一个数组a,数组a占6字节,"linux"本身只存在于编译器中,编译器用它初始化完数组a后丢弃掉(内存中没有"linux"这个字符串)
  5. 字符串char *p =“linux”; 定义了一个字符指针p,p占8字节,分配在栈上,同时还定义了一个字符串"linux",分配在代码段,然后把代码段中的字符串(一共占6字节)的首地址赋值给p
  6. 字符数组和字符串有本质差别,字符数组本身是数组,数组自带内存空间,可以用来存东西;而字符串本身是指针,本身只占8字节,还不能用来存有效数据。需要额外的内存来存那些内存
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值