C++随手笔记(四)char字符、字符数组、字符串、字符串指针、string类型、const char * 、char const * 与 char * const

1、字符与字符串

字符型常量是用单引号包含起来的一个字符,如‘a’, ‘b’;
字符串常量是用一对双引号包含起来的一堆字符,如"a"、”Hello word!" 等;

‘a’与“a”的区别:
字符 ‘a’ 在内存中占1字节, “a” 在内存中占2字节。“a” 的最后一个字符为’\0‘
’\0‘ 是一个转义字符,标记字符串内容结束

变量定义与赋值:

char c;
c = 'a';  //正确
c = "a";  //错误,不能把一个字符串赋值给一个字符型变量

char cc[] = "a";  //正确

2、字符数组

用来存放字符数据的数组就是字符数组。

字符数组的初始化:
1)逐个字符赋给数组中的元素。

char c[10] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};

2)如果提供的初值个数和预定的数组长度相同,定义是可以省略数组长度,系统会自动根据初值个数确定数组长度:

char c[] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};

3)如果初值个数大于数组长度,则做语法错误处理:

char c[8] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; //编译时会报错

4)如果初值个数小于数组长度,则只将这些字符赋给数组中前面的元素,其余的元素值可能给’\0’,也可能无法确定,所以强烈不建议使用这些无法确定的元素值。

char c[12] =  {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};

3、字符串

‘\0’ 的ASCII码是0。
‘\0’ 称为字符串结束标志。C语言对字符串常量会自动在其末尾增加一个 ‘\0’ 作为字符串结束标记。
注意:’\0’ 会占一个字节

char c[10] = "I am happy";  //错误:数组c中必须要为'\0'字符留有位置
char c[11] = "I am happy";  //正确,刚好都能放下

字符串与字符的区别与联系:

char c[] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'};
char c[] = "I am happy";

上述两行代码不等价,因为后一种写法系统会自动在字符串末尾增加 ‘\0’ 。
但是下面两行代码等价(长度相同吗,内容相同):

char c[] = {'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y', '\0'};
char c[] = "I am happy";

字符串处理函数:

  1. puts(字符数组);
    将一个字符串输出到屏幕;
    例:
char str[100] = "hello word";
puts(str);
  1. strcat(字符数组1,字符数组2);
    连接两个字符数组中的字符串,把数组2的内容接在数组1的后面,结果存放在数组1中,
    注意:数组1必须足够大,能够容纳连接后的新字符串
    例:
char str1[20] = "hello";
char str2[10] = "word";
strcat(str1,str2);
  1. strcpy(字符数组1,字符数组2);
    将字符串数组2复制到字符数组1中。字符数组1中的内容将被覆盖
    注意:不能用一个字符串常量或者字符数组名直接赋值给一个字符数组(字符数组名)
char str1[20] = "hello";
char str2[10] = "word";
strcpy(str1,str2);
  1. strcmp(字符串1,字符串2);
    比较字符串1和字符串2中的内容
    常用来判断两个字符串是否相等(返回0说明相等;返回-1说明2大;返回1,说明1大)
char str1[] = "hello";
char str2[] = "hello";
strcmp(str1,str2);
  1. strlen(字符数组);
    得到字符串长度。
char str[100] = "hello word";
int len = strlen(str);

注意:sizeof(a);a的变量类型所占内存的大小,与a的内容无关;

4、字符串指针

1)字符串表示形式

char str1[] = "hello word";
char str2[] = "hello word";

上述代码 st1与str2都是字符数组名,代表字符数组首地址。str1和str2所代表的地址不同。

const char* str1[] = "hello word";
const char* str2[] = "hello word";

上述两行代码中str1与str2指向的地址相同。

2)字符指针变量与字符数组
a、赋值方式:
例:


//1
char str1[100] = "hello word"; //定义时初始化

//2
char str1[100];
str1 = "helllo word";  //不允许这样赋值
//修改成如下可以
strcpy(str1,"hello word");

//3
const char *str2;
str2 = "hello word";  
//正确,"hello word"是字符串常量,在内存中有固定地址,只是让字符指针str2指向了这个地址

b、指针变量值是可以改变的,即指针指向的位置可以改变。
例:

const char *str1 = "hello word";
str1 = str1 + 6; //原来指向字符'h',跳过6字节,正好指向word
printf("%s",str1);  //word
//数组名虽然代表数组首地址,但其值不能改变:
char str2[] = "hello word";
str2 = str2 + 6://错误,因为数组名代表的数组首地址值是不能发生改变的
printf("%s",str2);

5、string类型

string 类型是一个标准库中的类型,代表一个可变长字符串。

string与char可以相互转换
1) string 转 const char*
有两个函数:
c_str(();
data();

例:

string str = "hello word";
const char *str1 = s1.c_str();
const char *str2 = s1.data();
  

注:只能转换成const char*,如果去掉const编译不能通过。

2)string 转 char*
copy();

例:

 string str = "hello word";
 char *data;
 int len = s1.length();
 data = (char *)malloc((len + 1)*sizeof(char));
 str .copy(data, len, 0);
 data[len] = '\0';

3)char* 转 string
直接赋值

string str;
char *str1 = "hello word";
str = str1 ;

4)char[] 转 string:

直接赋值

string str;
char str1[] = "hello word";
str = str1 ;

5)string 转 char[]:

char str1[100];
char str2[100];
string str("hello word");
strcpy(str1, str.c_str());
strncpy(str2, str.c_str(), str.length());
str1[str.length()] = '\0';
str2[str.length()] = '\0';

6、const char * 、char const * 与 char * const

1)const char *p;
p称为常量指针
p所存放的地址中的内容不能通过p改变。

例:

char str[] = 'hello word';
char *p;
p = str;
*p = ‘Y';
p++;  //p可以指向不同位置,只要这些位置的内存归我们管理即可

//若定义为:
const char *pp;
//则pp指向的内容不能通过pp来修改(pp所指向的目标,哪个目标中的内容不能通过pp来修改)。
//pp称为常量指针
pp = str;
*pp = 'Y';  //错误
str[0] = 'Y'; //正确 

2)char const * p; 等价于 const char *p;

3)char * const p;
p称为指针常量
p所存放的地址不能改变

例:

char str[] = "hello word";
char * const p = str; //定义的时候必须初始化
p++; //错误,p指向一个内容后,不可以再指向其他内容(p不可以指向不同地址)
*p = 'Y'; //正确,可以修改指向的目标中的内容

4)const char * const p; 或 char const * const p;
接合了 1)-3),表示p的指向不能改变,p指向的内容不能通过p改变。
p所存放的地址不能改变,p所存放的地址中的内容也不能通过p改变。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值