1,一维字符数组
(1)定义
char 数组名 [大小];
(2)初始化字符数组
char s[7]={'h','a','a','p','y'} //其余不确定
char s[ ]=....... //编译器会计算出数组大小
static char s[7]={'h','a','a','p','y'} //其余为0 所代表的是字符 '\0'
2,字符串
(1)特点
- 字符串的有效长度==有效字符个数
- 字符串由 有效字符 和 字符串结束符'\0'组成
- "Happy"由6个字符组成 'H' 'a' 'p' 'p' 'y' '\0'
- 字符串输入数组时,数组长度==有效字符数+1
(2)初始化
以"Happy"为例子
static char s[6]={'H','a','p','p','y','\0'}
static char s[6]="Happy" //注意是双引号
static char s[6]={"Happy"}
(3)字符串输入和赋值
A.输入
static char s[80];
s[0]='a';
s[1]='\0';
B.赋值
static char s[80];
s="a";
"a"和'a'区别:
"a"是由'a' and '0' 两个字符组成
'a'单指一个字符
(4)其他
static char s[80]="Happy";
只对前六个赋值,字符串遇到'\0'结束,所以不用担心。'\0'之后的其他元素和字符串无关。
'\0'不是指ASCII码值,它是字符,它的ASCII码值是0,也就是ASCII码表的第一个字符。'\0'并非是空格,空格的ASCII码值是32,只不过是输出类似于空格。
记得将输入结束符转换为'\0'.
(5)易错
1. 下述对C语言字符数组的描述中错误的是(C)。
A.不可以用关系运算符对字符数组中的字符串进行比较
B.字符数组中的字符串可以整体输入、输出
C.可以在赋值语句中通过赋值运算符"="对字符数组整体赋值
D.字符数组可以存放字符串
A “不可以用关系运算符对字符数组中的字符串进行比较。可以用关系运算符对字符进行操作,却不能对字符串进行操作
B 在C语言中,字符数组可以存放字符串。字符数组是对字符串有特殊处理能力的数组。字符数组就是用来对字符串进行操作的,当然可以存放字符串,且可以对字符串进行整体输入、输出。
C 数组的赋值操作是不能整体操作的,而需要对其中元素逐个赋值,字符数组也不例外。
不可以用赋值语句给字符数组整体赋一串字符.
char mark[80];
mark=“happy”;
当字符串变量是用的字符数组,不能由赋值语句直接赋字符串常量.
char Str_1[10]=“hello”;
char Str_2[10];
Str_2=Str_1;
以上赋值时不允许的
D 字符数组存放字符串方法如下
static char s[6]="Happy";
3,字符串再次探讨
(1)字符串基本特征(补充)
-
字符串是以 0或'\0'结尾的一串字符
-
0标志字符串的结束,但它不是字符串的一部分。计算字符串长度的时候不包含这个0
-
string.h里有很多处理字符串的函数
a[ ]={'h','e','l','l','a'}
b[ ]={'h','e','l','l','a','\0'}
b是字符串,a不是
(2)字符串常量
- "hello"
- "happy"会被编译器变成一个字符数组放在某处,长度为6,结尾还有表示结束的'\0'
- 相邻字符串,无其他符号,则会连在一起
-
#include <stdio.h> int main(){ printf("你好,很高兴" "见到你,我很开心。"); return 0; } 输出:你好,很高兴见到你,我很开心。
字符串常量以字符数组的形式存在
不能进行运算
按照数组遍历的方法,遍历字符串
(3)字符串变量
char* str="happy"
#include <stdio.h>
int main(){
char* str="happy"; //初始化指向一个字符串常量
char* str2="happy";
int i=1;
printf("i = %p\n",&i);
printf("str = %p\n",str);
printf("str2 = %p\n",str2);
//str[0]='B'; //[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
printf("%c",str[0]);
return 0;
}
输出:
i = 000000000062FE0C
str = 0000000000404000
str2 = 0000000000404000
i是本地变量,我们发现变量i的内存地址远远大于str,str2。
而且更改字符串的话,出现了warning
- 指针str,str2指向了一个很远的地方。叫做代码段。只读,不可更改。所以更改字符串时出现了warning
- 想要更改,使用字符数组
(4)char* 是字符串?
- 字符串可以表达为char*
- char*不一定是字符串
- char* 本意是指向字符或字符数组的(类比 int*,指向整型,或整型数组)
- 只有当char* 指向的字符数组,最后一个是'\0'时,才可以称char* 为字符串