char型指针在c++里面已经被当成字符串了,打印时候会把指针当做字符串打印,需要打印时候可以转化为void*
类型
char c = 'a';
char* ptr_char = &c;
cout<<(void*)ptr_char<<endl;
void* 一种特殊的指针类型,可以存放任意对象地址
- 存放一个内存地址,地址指向内容的类型不能确定。也就是说不能通过他改变指针指向的数据,即下面代码报错
int num = 123;
void* ptr = #
*ptr = 456;
void*
类型指针一般用来:和别的指针进行比较、作为函数输入输出、赋值给另一个void*
指针
引用:为对象起另一个名字
- 引用并非对象,只是为已经存在的对象起了一个别名
- 只能绑定在对象上,不能与字面值或者某个表达式计算结果绑定一起。如
int &ref = 10
就是错误用法,但是可以在前面加一个const
更正,就可以看成一个常量引用。 - 引用必须初始化,故使用引用之前不需要测试有效性,因此引用可能比指针效率高。
动态内存分配
使用new分配内存
- 在运行阶段分配未命名的内存以存储值
- 只能通过指针来访问内存
int* ptr = new int;
使用delete释放内存
- 与new配对使用
- 别释放已经释放的内存
- 别释放声明变量分配的内存
注:不要使用delete释放同一内存两次;如果使用new [ ],为数组分配内存,则对应delete [ ]释放。
程序内存分配空间
- 栈区stack
由编译器自动分配释放,一般存放函数参数值,局部变量等,如int a
中a就是存放在栈区;
操作方式类似于数据结构中的栈,先进后出。 - 堆区heap
一般由程序员分配释放,若程序不释放,程序结束时可能由操作系统回收;如int* a = new int;
所分配给int
四个字节的内存就存放在堆区,而指针变量存放在栈区
与数据结构中的堆是两回事,分配方式类似于链表。 - 全局区(静态区,static)
全局变量和静态变量是存放在一起的,程序结束后由系统释放 - 文字常量区
常量字符串就存放在这里,程序结束由系统释放 - 程序代码区
存放函数体的二进制代码