字符串指针的定义、初始化与赋值

指针的定义、初始化与赋值

char * 和 const char *

const char *p1 ; char * const p1 ; const char * const p1; //三者都不一样
const int a; int const b;  	//const修饰 a b意义相同
const char *c; 		//const修饰c所执行的内存空间,即c所存储得内存空间不能被修改,但c指向的对象可以修改
char * const d; 			//d是一个常量指针;

1.char * //字符指针,指向字符的指针

2.const char *,字符串常量,即像"aaa"这样的类型

3.string 是std::basic_string模板类的实例化,是一个类(C++的STL才有),string str=“aaa”; 其实是 const char *转class ,string重载了=号,把“aaa”封装成std::string,而 “abcd”是字符串常量,不可更改

4.char a[8]; // a的类型是 char [8],如果是char a[6]; 则a的类型就是char [6] 既长度为N的字符数组

用字符串常量给指针和数组赋值

!! VS不可以 char *p=“abcd”

注意:编译器是把"abcd"作为“abcd\0”来处理的,有五个字符
为什么要加上’\0’?,‘\0’代表空格符,在字符串结尾加上‘\0’,代表字符串已经结束,读到\0的时候会停下来,不然会沿着内存地址一直读下去,读到什么乱七八糟的东西就不知道了,比如会读到类似 “烫烫烫烫”的东西

原文链接:https://blog.csdn.net/weixin_43202635/article/details/98469997

*原因——“abcd”是字符串常量,不可更改,必须加上const用常量指针,即 const char *p = “abcd”
const char p="hello"分配在静态存储区,不可以改变.
char p[]="hello"分配在堆上.

char *str = "abcd" ;  //错误,"abcd"是字符串常量,是const char 类,
const char *str = "abcd"; //正确,str在指向“abcd”期间不能更改内容
char *str = (char *)"abcd" ;  //正确,强制转换类型
*str[3] = 'e';  //上面两种方法定义的str都错误,没有更改权限

故,若想要将字符串存储为可更改的模式,可以用char str[] = "hello world"; 或者string。

char str[] = "hello world ";
str[5] = '%';

输出:
hello%world

数组和指针表示字符串的异同

同:

字符串数组,str也可以认为是一个指针,指针以及数组方面操作均适用。

不同:

它们最根本的区别是在内存中的存储区域不一样,
字符数组存储在全局数据区或栈区,而以指针形式表示的字符串却存储在常量区。
全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
!!数组形字符串存放在全局数据区或栈区,可读可写。指针字符串存放在常量区,只读不能写。

留待解决的问题:

1、怎么定义长度可变的数组?

vector<int> rotateArray;   //长度可变的数组
int n = rotateArray.size();

2、变量有可能通过某种方法作为数组长度吗?

C++中一般是不能使用变量作为一个数组的长度的,必须使用常量。
这是因为数组作为C++的内置数据类型,其空间分配在栈内存中,这部分空间的大小在编译时就要确定,不能等到运行时再分配。常量的值在编译时就能得到,而变量的值在运行时才能确定。
但是仍然有办法使用变量作为数组的长度:绕过栈内存,将数组空间开辟在堆空间内:

int *d = new int[n];

这样这块内存就是自己开辟的了,可以使用变量初始化数组的长度,内存空间会在运行时动态分配。
注意:

  1. 使用完这个数组后要delete掉,防止内存泄漏。
  2. 如果可能的话,使用STL容器替代内置的数组类型,能得到更好的性能和撸代码体验。

3、用 const ,enum 取代 #difine

  1. const 或者 static const
	static const int n = 5 ;
	int b[n] = { 1, 2, 3, 4, 5 };
  1. enum
	enum { n = 5 } ;
	int b[n] = { 1, 2, 3, 4, 5 };
  • 15
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值