- 如果某个指针变量可以保存包含int类型值的内存位置的地址,则该变量的类型是“指向int”类型的指针。
- 间接成员选择操作符->专用于通过指针访问结构(或类)的成员.
指针结构体变量用 ->, 普通结构体变量用 .
点运算符(.)左边为结构体名称。
箭头运算符(->)左边为结构体指针。
顺便说一句,*运算符两边的空格是可选的。
//传统上,C程序员使用这种格式int *ptr //这强调*p是一个int类型的值。//而很多C++程序员使用这种格式:int* ptr;//这强调的是:int*是一种类型——指向int的指针。在哪里添加空格对于编译器来说没有任何区别,您至可以这样做:int*ptr;int * ptr;//但要知道的是,下面的声明创建一个指针(p1)和一个int变量(p2):int* p1,p2;//对每个指针变量名,都需要使用一个*.
注意:在C++中,int*是一种复合类型,是指向int的指针。
可以在声明语句中初始化指针。在这种情况下,被初始化的是指针,而不是它指向的值。
也就是说,下面的语句将pt(而不是*pt)的值设置为& higgens:
int higgens =5int* pt= &higgens;
警告:一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。这是关于使用指针的金科玉律。
为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的通用格式如下
typeName * pointer_name = new typeName;
需要在两个地方指定数据类型:用来指定需要什么样的内存和用来声明合适的指针.
对于指针,需要指出的另一点是,new分配的内存块通常与常规变量声明分配的内存块不同。变量 nights和pd的值都存储在被称为栈( stack)的内存区域中,而new从被称为堆(heap)或自由存储区( free store)的内存区域分配内存。第9章将更详细地讨论这一点。
不要尝试释放已经释放的内存块,C++标准指出,这样做的结果将是不确定的,这意味着什么情况都可能发生。另外,不能使用 delete来释放声明变量所获得的内存.
int* ps=new int; //okdelete ps; //okdelete ps; //okint jugs = 5; //okint* pi=&jugs; //okdelete pi; //not allowed,memory
通常,对于大型数据(如数组,字符串,和结构),应使用new,这正是new的用武之地.
使用new创建动态数组
int* psome=new int[10];//new 返回第一个元素的地址delete []psome;
总之,使用new和 delete时,应遵守以下规则。
- 不要使用 delete来释放不是new分配的内存。
- 不要使用 delete释放同一个内存块两次
- 如果使用new[]为数组分配内存,则应使用 delete[]来释放
- 如果使用new[]为一个实体分配内存,则应使用 delete(没有方括号)来释放
- 对空指针应用 delete是安全的。
指向常量的指针:
int age=89;const int* pt=&age;
该声明指出,pt指向一个 const int(这里为39),因此不能使用pt来修改这个值。换句话来说,*pt的值为 const,不能被修改:
将const变量的地址赋值给指向const的指针✔
将const的地址赋值给常规指针.×
const float g_erath=9.8;const float* pe=&g_earth; //validconst float g_moon=1.63;float* pm =&g_moon;
对第一种:既不能用g_earth来修改9.8,也不能用pe来修改.
C++进制将const的地址赋值给非const的指针.
