字符串到底是什么?

字符串的本质

// 探究一个字符串由什么构成
#include<stdio.h>


int main(){
	char arr[50] = "asdasdasdasdasdasd";
	printf("以%c打印整个字符串数组");
	for(int i = 0; i < 50; i++)printf("%c ", arr[i]);
	printf("\n");
	printf("以%d打印整个字符串数组");
	for(int i = 0; i < 50; i++)printf("%d ", arr[i]);
	return 0;
}

在这里插入图片描述
由上面可以看出:
字符串包含字符串常量和末尾加入的空字符\0们

1.这里的0实际上是char形式的空字符\0而非数字字符0,第一个\0是编译器自动添加的,之后的\0是故char数组默认初始化而出的
2.故为了保证让编译器自动添加空字符’\0’,数组开辟空间时大小必须≥ (字符数量+1) 。如果未添加空字符\0,那么这个char数组便仅仅是字符数组而非字符串数组

  • 字符串数组 = 字符数组 + 空字符’\0’
  • 字符串 = 字符常量 + 空字符’\0’


字符串常量相关

双括号中的内容称为字符串字面量, 也叫做字符串常量。故上文黄字可写为:

字符串常量可以看作是一个不会改变的变量,它是静态储存的(注意!字符串常量储存在数据段,是静态储存!)

我们把字符串常量作为指向该字符串储存位置的指针(类似把数组名作为指向数组储存位置指针)

// 将字符串常量作为存放了字符串地址的指针进行操作
int main(){
	char arr[50] = "asdasdasdasdasdasda";
	
	printf("%c, %s, %p", *"asdasdasdasdasdasda", "asdasdasdasdasdasda", "asdasdasd");
	return 0;
	
	// 结果为 a, "asdasdasdasdasdasda", 0x100000f61
}



字符串数组和初始化

字符串数组的构建需要编译器区自动添加一个\0,因此我们需要用特殊的初始化方法来让编译器知道你初始化的是一个字符数组还是字符串数组。

字符串的初始化同数组的初始化,只不过都是通过字符常量来赋值。

int main(){
	char arr1[8] = "i am sad"; 
	char arr2[8] = {'i',' ', 'a','m', 's', 'a', 'd','\0'};
	char arr3[7] = {'i',' ', 'a','m', 's', 'a', 'd'};
    /*当然也可以不提前声明数组的大小,编译器会同数组一样自动分配该字符串的大小*/
    char arr4[] = "i am sad"; 
    /*使用指针*/
    char *arr5 = "i am sad";
}

arr1的初始化等效于arr2的初始化,它们都是字符串数组,而arr3只是一个普通的字符数组



个人有个小问题:
若char数组末尾是默认初始化为\0,而不是编译器自动添加的\0,此时的char数组时字符串数组吗?
(实际结构一模一样的话应该就是了吧(雾))

```c
int main(){
	char arr2[8] = {'i',' ', 'a','m', 's', 'a', 'd','\0'};
 	char arr2[8] = {'i',' ', 'a','m', 's', 'a', 'd'}; // 问:默认初始化为\0而不是编译器自动添加的\0,此时的char数组时字符串数组吗
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值