int a;
int * const p = &a //指针常量,*p可以修改*p = 8;(OK)
p不可以修改 p++(ERROR)
int a,b;
const int *p = &a;//常量指针 *p不可修改 *p = 8;(ERROR)
p 可以修改 p = &b (OK)
关键要看const修饰的是谁
const修饰变量p,表示指针p不能改变方向,即指针常量,但可以改变其值
const修饰char * ,表示char字符串为常量,即常量指针,不能改变其内容,但可以改变方向
eg01:
#include<iostream>
using namespace std;
int main()
{
const char * p1="ada";
char * p2="13123";
p1=p2;
cout<<p1<<endl;
return 0;
}
字符和整型有些不一样
char * p=“1312”;(后面的p如果是指向的是一个字符串,p实际上是const char * p,所以现在p指向的内容也不能去修改,
这个是表面的一种解释,本质上是因为1312为常量字符串,存储在代码区中,想要改变代码区中的内容,显然不行)
#include<iostream>
using namespace std;
int main()
{
char a='1';
char * p = "123";
p[0]='1';
// cout<<a<<endl;
}//ERROR
eg02:
#include<iostream>
using namespace std;
int main()
{
int b=1;
int *const a=&b;
cout<<b<<endl;
*a=3;
cout<<b<<endl;
}
二.strcpy()
1. string转const char*
2. const char*转string
3. string转char*
4. char*转string
5. const char*转char*
//string(const char *) 转 char*
string str ("transfer");
char * ch = const_cast<char*>(str.c_str())
6. char*转const char*
(char * p可以默认的转换为const char *,解释如下,char *对 p的限制叫宽泛,而const char *p对p的
的限制多,不能修改而已,就是少了一项功能,这种思维在逻辑上是可行的,但是反过来,它将原来的的范围变大了,就不行了,
反过来就是给它增加了可以修改的功能,逻辑上不行。
其实这个有点类似c++子类父类关系,可以通过父类对象初始化子类对象,但是反过来就不行了)
#include<iostream>
using namespace std;
void fo(const char * p)
{
}
int main()
{
char b=1;
char * a=&b;
fo(a);
}//OK
#include<iostream>
using namespace std;
void fo( char * p)
{
}
int main()
{
char b=1;
const char * a=&b;
fo(a);
}//ERROR
3.
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的
- 程序结束释放
4常量区 一个专门放常量的地方
对变量存放位置有影响的是,static修饰,以及声明位置是函数内,还是函数外(const修饰的变量不影响区存放位置,只是标示该变量只读)
局部变量是在程序执行中,也就是楼上说的执行的时候分配的内存。。而不是处在编译阶段。。编译阶段是处理全局变量这种拥有静态存储周期的变量来的
局部变量和动态申请堆内存的变量实在运行时分配存储空间的,静态区的数据是在编译时分配内存空间的(全局变量,静态局部变量,静态全局变量)