C++基础--字符数组与字符指针与string的关系

C++基础--字符数组与字符指针与string的关系

 

1. char [] 是数组

这里谈到数组,必然需要知道与指针的关系。

基本常识:数组名本身就是一个指针,指向数组起始元素。

编译器在处理形如 a[i] 的表达式时,将这个表达式转换成 *(a + i) 的形式,然后计算表达式的指向地址。(这也是 C/C++ 下标从 0 开始的原因,表示与头地址的偏移量。)

表达式转换如图所示:

由此,可以解释:

  • 使用 scanf("%s", str) 语句,只有字符串不用加取地址符,因为 str 本身代表 str[] 的地址;

  • 使用 sort(a + 1, a + n + 1) 语句,a + 1 和 a[1] 编译后是相同的,同为 a[1] 的地址。

2. char * 与 char [] 的区别

char * 本质上是指针;char [] 本质上是数组。

特殊的:

char *a = "abcd";     // (1)
char a[20] = "abcd";  // (2)

在源代码中出现的字符串(用 "" 包括的内容)都是字符串常量。(1) 句是把指针指向字符串常量 "abcd" 的首字符;(2) 句则把字符串常量复制到字符数组中。显然前者不可修改,后者可修改。也就是说,此时a[]是指向栈区的,而a则指向文字常量区。一个是直接指向,一个是复制,而a其实也可以指向栈区,只要有栈区的变量。

 

3. string

string使用时可以看作字符数组,C++STL提供了string基本字符系列容器来处理字符串,可以把string理解为字符串类,他提供了添加删除,替换,查找和比较等丰富的方法,string内部封装了char*,管理这个字符串,是一个char*型的容器,并且还添加了上述功能相关的方法。string管理char*所分配的内存,不用担心赋值越界和取值越界等,都是由类的内部负责的。

虽然使用vector<string> 这样的向量也可以处理字符串,但功能比不上string。向量的元素类型可以是string,如vector<string>这样的向量,实际上就类似于C语言中的字符串数组;

使用string容器,需要包含头文件声明#include <string> ;

 

 

参考:https://blog.csdn.net/keshacookie/article/details/18356189

 

posted @   FrankPlus  阅读(298)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示