指针的定义、初始化与赋值
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];
这样这块内存就是自己开辟的了,可以使用变量初始化数组的长度,内存空间会在运行时动态分配。
注意:
- 使用完这个数组后要delete掉,防止内存泄漏。
- 如果可能的话,使用STL容器替代内置的数组类型,能得到更好的性能和撸代码体验。
3、用 const ,enum 取代 #difine
- const 或者 static const
static const int n = 5 ;
int b[n] = { 1, 2, 3, 4, 5 };
- enum
enum { n = 5 } ;
int b[n] = { 1, 2, 3, 4, 5 };