指针
前面给大家介绍了数组、字符串、结构以及共用体和枚举,这里给大家讲讲指针。
指针是一个变量,其中存放的是地址,而不是值本身。在讲指针初始化之前,大家想想,在学习C语言的时候,使用scanf函数进行输入时,需要使用&地址运算符,来获取变量的地址。其实在C++也运用到了&,只是C++将其解释为引用,即为内存取了一个别名。在使用常规变量时,值是指定的量,而地址派生量,而在处理存储数据时,则将地址视为指定的量,值视为间接值。
指针的使用
声明和初始化指针
在使用指针时,计算机需要知道跟踪指针指向的值的类型,因此,在指针声明是必须指定指针指向的数据的类型。
#include<iostream>
using namespace std
int main(){
int* ptr;
int *pt;
double* tax;
int q=10;
int* q_d=&q;
char* str;
*str='d';//错误,不要这样做
int *de=(int*)0xB8000000;
const char* ne="dgsadg";
return o;
}
第一点,代码第一个int*和第二个int *两种方法都可以,只是两者强调的内容不一样,前者强调这是一个指向int值的指针,后者强调这是一个int值。第二点,double类型虽然和int类型的宽度不同,但两者的指针宽度是相同的。第三点,一定不要使用*str='d'这样的方法为你的指针赋值,因为当你声明指针的时候,由于没有初始化,它有可能有任何值,一旦你这样赋值,就把指针内所指向的地址内存的值覆盖了,这种错误难以发现,十分隐蔽。第四点,要使用数字值作为地址使用,要通过强制类型转换改成适当的地址类型。第五点,可以用指针建立字符数组,但一定要使用const限定符。
使用new来分配内存
前面讲到指针只是通过名称可以访问的内存提供的一个别名,真正使用指针的是在运行阶段分配未命名的内存以存储值。C语言使用的是malloc(),C++使用的是new()。
#include<iostream>
using namespace std
int main(){
int* ptr=new int;
delete ptr;
double* tax=new double [5];
tax[0]=1.2;
tax[1]=3.4;
delete [] tax;
return o;
}
new的使用方法如上述代码,需要注意的是每一个new都要有一个delete来释放内存,否则将会导致内存泄漏。其次因为new是在运行阶段分配内存,所以使用new创建的数组称为动态数组,对应的也要使用delete []来释放内存。
讲到这里可以和大家讲一下C++管理数据内存的方式,包括自动存储、静态存储、动态存储。在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),这意味着它们在所属的函数被调用时自动产生,在该函数结束时消亡。静态存储是整个程序执行期间都存在的存储方式。使变量成为静态的方式有两种1.在函数外面定义,2.使用关键字staic。new和delete运算符提供了一种比自动变量和静态变量更灵活的方法。它们管理了一个内存池,这在C++中被称为自由存储空间(free store)或堆(heap)。该内存池同用于静态变量和自动变量的内存是分开的。因此,数据的生命周期不完全受程序或函数的生存时间控制。
模板类vector
模板类vector类似于string类,也是一种动态数组,功能十分强大。
#include<iostream>
using namespace std
int main(){
vector<int> vi;
int n;
cin>>n;
vector<double> vd(n);
return o;
}
vi是一个 vector<int>对象,由于vector对象在你插入或者添加值时自动调整长度,因此可以将初始长度设为0。这里只是提一下,后面讲到容器会详细介绍。