总结: String其实是使用的一个char类型的数组来存储字符串中的字符
。
1. 什么是字符串
C语言中的字符串不是一种基本类型,是一种
约定
。
之前我们已经学过单个字符的文字型数据(char
),在C语言中,字符串用双引号包围。
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("Hello");
return 0;
}
字符串不是C语言中的基本数据类型。
在我们之后的学习中可以看到,它是根据约定存储多个char数据的一种方式
。
2. C语言中的字符串
为了方便研究,我们将以上代码进行修改:
#include <stdio.h>
int main(int argc, char* argv[])
{
char* szHello = "Hello"; //szHello存储的为地址
printf("%s", szHello);
return 0;
}
实际上,当我们定义"Hello"
时,编译器帮助我们做了以下几件事情:
- 根据"Hello"的字符串长度,分配一段char类型的空间,6个字节的空间
- 将"Hello"中的字符一个一个复制到以上的空间中
- 在以上空间的末尾添加数字0作为结束标志
- 将字符串的首地址返回(char*类型)(空间中有6个字符,没有一个代表完整字符串,因此返回首地址,由于指向的数据类型为
char
类型)
#include <stdio.h>
int main(int argc, char* argv[])
{
char* szHello = "Hello";
printf("Hello字符串的空间大小: %d\r\n", sizeof("Hello"));
printf("Hello字符串的首地址: %08X\r\n", szHello);
return 0;
}
运行结果:"Hello"
占用6个字节
我们甚至可以结合数组的知识,将字符串空间对应的char数据,一个个取出来,并输出:
#include <stdio.h>
int main(int argc, char* argv[])
{
char* szHello = "Hello";
int i = 0;
for (; i < sizeof("Hello"); i++)
{
printf("%d: ASCII数值:%d, 对应字符:%c\r\n",
i, szHello[i], szHello[i]);
}
return 0;
}
注意:C语言中规定以数字0作为字符串的结尾
。
3. 字符数组与字符串的比较
因为字符串中的每一个元素都是char类型,所以与字符数组有相似的地方。比如:
#include <stdio.h>
int main(int argc, char* argv[])
{
char* szHello = "Hello";
char chAry[] = "Hello";
printf("%s, %s\r\n", szHello, chAry);
return 0;
}
运行结果:
但实际上是有区别的:
#include <stdio.h>
int main(int argc, char* argv[])
{
char* szHello = "Hello";
char chAry[] = "Hello";
chAry[0] = 'j';
printf("%s\r\n", chAry);
szHello[0] = 'j';
printf("%s\r\n", chAry);
return 0;
}
运行结果:字符串不可写入
字符数组和字符串的区别简而言之:
字符数组可读可写
字符串可读不可写
4. 学习视频地址:字符串