C++ string和char* 区别, char** a 和 char* a[ ] 区别

本文对比了C++中的string和char*在定义、内存管理、操作便利性和转换方面的特点,强调了string的自动内存管理和丰富的操作函数,以及char**和char*a[]的区别,尤其是在指针层次和数组使用上的差异。
摘要由CSDN通过智能技术生成

一. string和char* 区别

1、定义:

string:string是STL当中的一个容器,对其进行了封装,所以操作起来非常方便。

char*:char *是一个指针,可以指向一个字符串数组,至于这个数组可以在栈上分配,也可以在堆上分配,堆得话就要你手动释放了。

2、区别:

string的内存管理是由系统处理,除非系统内存池用完,不然不会出现这种内存问题。
char *的内存管理由用户自己处理,很容易出现内存不足的问题。

当我们要存一个串,但是不知道其他需要多少内存时, 用string来处理就最好不过了。
当你知道了存储的内存的时候,可以用char *,但是不如用string的好,用指针总会有
隐患。

用string还可以使用各种成员函数来处理串的每一个字符,方便处理。
用char *处理串,就不如string的方便了,没有相应的函数来直接调用,而是要自己编
写函数来完成串的处理,而且处理过程中用指针还很容易出现内存问题。

char *s="string"的内容是不可以改的;char s[10]="string"的内容是可以改的

3、注意:

当我们定义了一个string,就不能用scanf("%s",s)和printf("%s",s)输入输出。主要是因为%s要求后面是对象的首地址

4、转化:

当 string 直接转化成 const char *时,可以通过两个函数c_str(),data()成员函数。

将char *转化成string,直接转化就可以。就是注意输出的问题。

 

 

二. char** a 和 char* a[ ] 区别

1.  char** a

在 char** a 中,a 是一个指针,这个指针(a)指向一块内存地址,该内存地址中存储的是 char* 类型的数据。指针的加减运算在这里的体现为:a + 1 表示地址加8字节(在32位系统中,地址加4字节)。

char* 也是一个指针,用 *a 表示,这个指针(*a)指向一块内存地址,该内存地址中存储的是 char 类型的数据。指针的加减运算在这里的体现为:(*a) + 1 表示地址加1字节。

说明:

  • 在32位系统中,一个指针占用4字节;在64位系统中,一个指针占用8字节;
  • 由于a指向一个指针类型(char*),故 a + 1 操作就是对指针类型的地址进行操作,所以 a + 1 表示地址加8字节;*a指向一个char类型,char类型占用1个字节,故 *a + 1操作就是对char类型的地址进行操作,所以 *a + 1表示地址加1字节。

 

2.  char* a[]

在 char* a[] 中,a是数组,数组中的元素是指针,这些指针指向char类型的数据

说明:

  • 数组里面所有的元素,在内存中都是是连续存放的;
  • 数组名在C语言中做了特殊处理,数组名使用数组所占用的(连续)内存区域的第一个字节的内存地址替代了。例如,数组占用的内存区域是 0x7fff5da3f550 到 0x7fff5da3f5a0,那么数组名a就会被替换成首地址 0x7fff5da3f550;
  • a+1 表示数组a的第二个元素的内存地址,所以 a + 1 是地址加8字节(再次说明,因为数组a的元素是指针(char*),指针类型占用8字节(64位内存地址));
  • char* a[10] 表示限定这个数组最多可以存放10个指针(char*)元素,也就是说这个数组会占用 10*8 = 80 个字节。

 

3.  可以把 char* a[ ] 给 char** 赋值,但不能使用 char** 给 char* a[] 赋值,因为在 char* a[] 中,a作为数组名,是一个常量,我们不能给常量赋值。

 

两者都可以作为程序的入参,用于接收用户执行程序时输入的参数,通常在 main 函数中使用:

int main(int argc, char ** argv)

int main(int argc, char *argv[])

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值