字符串---字符数组

  • 字符数组char a[] = {'l', 'i', 'n', 'u', 'x'};---代码段内存5字节
  • 字符数组char a[] = "linux";等价于char a[] = {'l', 'i', 'n', 'u', 'x', '\0'};---代码段内存6字节
  • 字符串char *p = "linux";---栈分配4字节存地址+代码段内存6字节

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


(2)字符串char *p = "linux";定义了一个字符指针p,p占4字节,分配在栈上;同时还定义了一个字符串"linux",分配在代码段;然后把代码段中的字符串(一共占6字节)的首地址(也就是'l'的地址)赋值给p。



字符串由字符数组,末尾加上'\0',变形而成

同样的数据字符数组和字符串存储大小有区别,字符串比字符数组大一个'\0'


均为数组形式存储数据,字符之间地址连续,可用下标访问



字符串常用的操作函数:
strlen :字符串长度
strcmp :字符串比较
strcpy :字符串拷贝
strcat :字符串拼接

字符数组与字符串的本质差异(内存分配角度)

  1. 字符数组本身是数组,数组自身自带内存空间,可以用来存东西(所以数组类似于容器);
  2. 字符串本身是指针,本身永远只占4字节(C51占3字节),这4个字节不能用来存有效数据,有效数据存到别的地方,然后把地址存在4字节中
  3. 字符数组自己存那些字符
  4. 字符串需要额外的内存来存那些字符,字符串本身只存真正的那些字符所在的内存空间的首地址。

(对于数组而言,a 与  &a  与  &a[0]  作用一致,均是内存段首地址)


 

char *c="abcdef";
char d[]="abcdef";
char e[]={'a','b','c','d','e','f'};
printf("sizeof(c):%d\tstrlen(c):%d\n",sizeof(c),strlen(c));
printf("sizeof(d):%d\tstrlen(d):%d\n",sizeof(d),strlen(d));
printf("sizeof(e):%d\tstrlen(e):%d\n",sizeof(e),strlen(e));

输出结果是
4 6
7 6
6 14


sizeof()操作符返回对象/类型所占空间大小(字节为单位),类型为size_t(看头文件可以知道就是int,只不过被typedef了一下标示用途而已)。常见用法有sizeof(变量)和sizeof(类型),具体实例代码有很多,可以自行搜索。
这个返回值的大小并不一定是对象的内容所占的空间。基于效率方面考虑,存在编译对齐这一行为,对于结构体来说,成员分布不一定连续,sizeof()的结果往往大于本身各个数据成员sizeof()返回值之和。(数组是连续存放的,通常编译器通常不对数组实施对齐,所以这里不需要考虑这点。)


strlen是从参数给定的内存地址开始判断该地址上对应的char值是否为0,如果不是则继续判断下一个,最后返回非0字节的个数,所以不只适用于字符串。不过对于非字符串,由于字符串结束符0存在的不确定,所以不一定能得到结果,有可能会因为访问到被系统保护禁止读取的内存区段导致程序崩溃。

sizeof(c):4,strlen(c):6。
c为指针,sizeof结果和sizeof(int)相同(32位系统中为4)。
c指向了长度为6的字符串字面量,所以strlen(c)返回6。


sizeof(d):7,strlen(d):6。
d是char[]数组,初始化中可以确定它的类型是char[7],每个元素(char型)占1个字节,所以共7字节。strlen理由同上。
注意初始化列表中的两个双引号之间的字符串字面量填充到数组中时,会自动在最后补0。


sizeof(e):6,strlen(e)。
由初始化可见e是char[6]型的。
strlen(e)理论上来说是不确定的。如果LZ给的代码放在函数体内,定义的是自动变量,这里以字符串形式输出e可以发现后面有d的内容。(不是 GhostWzf 说的“自动分配”,LZ可以自己改变d的内容然后再输出看看。)原因是C实现过程中,自动变量存储在栈空间上,内存是高内存地址向低内存地址分配的。所以可以通过之前定义的变量来估计可能的结果。但是实际一般不会用这种方法,变数太多(例如受到对齐设置的影响)。相对而言,strlen作用于非字符串,结果无法预料,本身就是错误的(非语法错误,是语义错误/逻辑错误),所以,结果无法预料。

sizeof: 根据你的内容的大小,返回一个数值。也就是说它反映的是你的数组的空间大小,或者是指针的大小。
strlen:根据你数组中字符串的大小,返回一个数值。字符串,是以0结尾的ASCII码。其中0所在的位置不算在字符串内。其中要注意一点,strlen长度记到0结束,跟数组的大小没有关系


以上问题就很好解决了:


sizeof(c):4,strlen(c):6      这里的c为指针,那么就反映指针的大小
sizeof(d):7,strlen(d):6      这里的d是数组
sizeof(e):6,strlen(e):        (不能确定) 对于这个数组,因为其只包含6个字符其中不包括0,而strlen要查到0才算结束,所以超出6个字符就不一定到什么位置能结束了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值