算术:将整数变量加1之后,其值将增加1
指针:将指针变量增加1后,增加的量等于它指向类型的字节数.比如,将double类型的指针加1后,如果系统对double使用8个字节存储,则数值就会增加8.
*
运算符被称为间接值(indirect value)或解除引用(dereferencing)运算符,将其应用于指针,就可以得到该地址存储的值.*var与常规变量等效.
&
用来取变量对应的地址值
c++将数组名解释为数组第一个元素的地址.
声明和初始化指针
int *point; //强调*point是一个int类型的值
int* point; //强调int*是一个指针类型
虽然指针的类型不一样,但是两个指针变量本身的长度是一样的,也就是说char和int地址的长度相同,地址的长度或值不能指示关于变量的长度或类型的任何信息.
注意一定要在指针初始化的时候给指针指定地址.
long * point; //初始化了一个指针,但是指针没有地址,所以不知道这个地址能不能被程序所使用
*point = 123; //给指针赋值,指针仍然没有地址
注意 指针不是数字
int * point;
point = (int *) 0xB88888; //要用()int *)指针类型来强制转换
分配内存
变量是在编译时分配的有名称的内存,而指针只是为可以通过名称直接访问的内存提供了一个别名,指针的真正用武之地在于,在运行阶段分配未命名的内存以存储值,在这种情况下只能通过指针来访问内存.
new分配的内存块通常与常规变量声明分配的内存块不同.变量声明的内存块都存储在被称为栈(stack)的内存区域中,而new从被称为堆(heap)或自由存储区(free store)的内存区域分配内存.
c语言中使用malloc()
来分配内存,在c++中使用new
运算符.
typeName * pointer_name = new typeName;
int * pn = new int;//new int高速程序,需要适合存储int的内存,然后找到内存块,并返回其地址,接下来将地址赋给pn,pn是被声明为指向int的指针.所以`pn`是地址,`*pn`是存储在改地址的值
delete pn; //释放内存,但没有删除指针pn本身,可以将pn重新指向另个一新分配的内存块,一定要配对使用new和delete,否则将会发生内存泄漏(memory leak),也就是说被分配的内存再也无法使用了.
动态数组
通常对于大型数据(数组, 字符串和结构),应使用new,这正是new的用武之地.例如,编写一个程序,它是否需要数组取决于运行时提供的信息,如果通过声明来创建数组,则程序被编译时就将为他分配内存空间.不管程序是否使用了数组,它都会占用空间.在编译时给数组分配内存被称为静态联编(static binding).
但使用new
时,如果在运行阶段需要数组,则创建它;如果不需要,则不创建,还可以在运行时选择数组的长度.这被称为动态联编(dynamic binding),这个数组叫做动态数组(dynamic array)
typeName * pointName = new typeName[numElements];
int * pt = new int;
short * ps = new short [10]; //ps指向数组第一个元素的地址,并且类型是short
*ps;//访问第一个元素的值
ps[0];//访问第一个元素的值,
ps;//数组第一个元素对应的地址
&ps;//数组对应的地址值
delete pt;
delete [] ps;//删除动态数组内存的格式
注意
1.不要使用delete释放不是new分配的内存
2.不要使用使用delete释放同一个内存块两次
3.如果使用new[]为数组分配内存,则应使用delete[]来释放
4.如果使用new[]为一个实体分配内存,则应使用delete来释放
5.对空指针使用delete是安全的
动态结构
自动存储,静态存储和动态存储
1.自动存储
函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),这意味着他们在所属的函数被调用时自动产生,在函数结束时消亡.自动变量是一个局部变量,其作用域是包含它的代码块,代码块是被包含在花括号中的一段代码.到目前为止,我们使用的所有代码块都是整个函数.
自动变量通常存储在栈中,在执行代码块时,其中的变量将以此加入到栈中,而在离开代码块时,将按相反的顺序释放这些变量.这被称为后进先出(LIFO).
2.静态存储
静态存储是整个程序执行期间都存在存储方式.两种方式来创建变量:一种是函数外面定义它;第二种是在声明变量时使用关键字static
2.动态存储
new
和delete
他们管理了内存池,在c++中被称为堆(heap),该内存池同用于静态变量和自动变量的内存是分开的,new
和delete
可以在一个函数中分配内存,在另个一函数中释放他.因此,数据的生命周期不完全受程序或函数的生存时间控制.在栈中,自动添加和删除机制使得占用的内存总是连续的,但new和delete的互相影响可能导致占用的自由内存不连续.为避免内存泄漏,最好的办法就是同事使用new
和delete
运算符,在自由存储空间上动态分配内存,随后释放他.