定义:type * p_address; (type:数据类型)
p_address = & valu; (&取引用)
*p_address; 表示地址中的值(解引用)
指针/数组 int array[3] = [7,1,5];
int* p_array = array;
(int类型(4字节)数组array所指向的是array[0]的地址,即&array[0],
一旦将array赋值给p_array,此时array和p_array都指向数组的第一个元素的地址,可以通过指针像数组一样操作数组,p_array[0] , array[0]含义相同)
指针运算:p_array++ 和p_array+1都指向数组的下一个元素(int类型占4个字节+1地址偏移4位(C++不会进行数组越界检测))
如上所有数组索引表达式可以写成指针加偏移量的形式:
array[1] 与 (p_array+1)相同
数组声明:type array [n];
array含义1:代表这个数组其类型时type[n];
array含义2:代表一个“常量”指针,指针类型时type ,指向的类型是type,指向的存区域是数组第一个元素(0号单元),该指针占有单独的内存区域,指针值不可修改,即类似array++的表达式错误。
引用:(本质常量指针)
数据类型 &别名 = 原名
type &b = a;
指针与引用:声明:double x = 7.5;
double* p = &x;
//引用声明 (引用声明时必须指定引用对象,且绑定关系不可改变)
double& y = x;9·····
上述“&”“”为定义引用与指针,非取址与解引用。通过p与y都可对x值进行更改;
指针与函数:指针作为函数参数
void swap (int * a ,int * b)//
{
int temp = *a;
*a = *b;
*b = temp;
}
int a = 10;
int b - 20;
swap(&a,&b); //C#,ref
指针指向函数:
void (*funcp)()//声明一个无参数无返回值的函数指针
funcp = &TheFunction;//
funcp = TheFunction;//函数指针赋值
funcp();//与函数调用书写方式无异,下式表示更明确
(*funcp)();//间接调用
C++内存分区模型:
程序运行前存在
//代码区:存放函数体的二进制代码,有系统进行管理。
存放及其指令
特点:共享,只读。
全局区:存放全局变量和静态变量以及常量。
常量包括:字符串常量,const修饰变量:修饰 的全局变量,(const修饰的局部变量不再全局区)。
//运行后
栈区:(指针本质局部变量放在栈上,保存堆区数据的地址)由编译器自动分配释放,存放函数参数值,形参,局部变量等。(不要返回局部变量的地址,栈区开辟的数据由编译器自动释放):函数中的局部变量存放在栈区,栈区的数据在“函数”执行完成后会自动释放,在此、次访问时地址中的数据已发生改变。(只保留一次)
堆区:由程序员分配释放,若不释放,程序结束时由系统进行回收。由new type;与delete申请/释放。
动态内存分配:(在“堆”区开辟空间,由程序员管理,开辟/释放)new type,(new返回type类型的指针)
int* p_int;
p_int = new int ;//或p_int = new(int)
delete p_int
int* p_arrayint ;
p_arrayint - new int[10]//声明数组内存空间,不能分配时返回NULL
delete[] p_arrayint;
分配到的内存系统不会自动回收,需要调用delete[] p_arrayint;来释放内存。
不释放则导致内存泄漏。