int *p;
p=int * new int[10]指针数组;数组的每个元素存放的是指针
p= (int *) new int[10]数组指针p存放的是数组的首地址
p=new int[10] p为指向一片连续空间的第一块地址 delete p释放第一块地址delete []p为释放这一片连续空间
我感觉(int *)new int[10]和new int [10]的意义一样
c++中编译系统将形参数组名一律作为指针变量来处理
void sort(int array[])==void sort (int *array)
实参数组名代表一个固定地址,或者说是指针型常量,因此不能改变
int a[10]
a++错误
动态分配空间
new int;开辟一个存放整数的存储空间,返回的是指向该存储空间的地址(即指针)
new int(100);开辟存放一个整数的存储空间,并指定该整数的初值为100,返回一个指向该存储空间的地址;
new char[10];开辟一个存放字符数组(包括10个元素)的空间,返回字符数组首元素的地址;
new int[5][4]开辟一个存放二维整型数组(大小为5*4)的空间。返回首元素的地址
float *p=new float(3.14159)开辟一个存放单精度数的空间,并指定该数的初值为3.14159,将返回该空间的地址赋给指针变量p
动态分配和静态分配
动态分配是在堆中开辟的,开辟的内存生命周期由程序员自己管理
静态内存分配是在栈中,其生命周期由系统维护
一个进程栈的内存远小于堆的内存大小
malloc(size)像系统申请分配指定size个字节的空间,返回类型是void *,c++ 和c规定,void*类型可以强制转换为任何其它类型的指针
int *p;
p=(int *)malloc(sizeof(int))需要强转才能被p接收
指针运算
int a[]={1,2,3,4,5,6};
int *p=a;
对于指针的加减运算,标准上来说只允许指针指向数组内的元素,或者超过数组长度的下一个元素。指针运算的结果也只允许指针指向数组内的元素或超过数组长度的下一个元素。
如果a的地址为1000则p++的结果为1004,为什么不是1001?因为对指针进行加1运算,地址的值会增加当前指针所指向数据类型的长度,因为p是指向int的指针,我的环境中int类型的长度(环境不同长度也可能不同)是4,所以给地址加1,指针前进4
对指针加N,指针前进“当前指针指向的数据类型的长度xN”
字符串指针
char *p=“123456”
p和123456都是占用内存的,p占用内存为sizeof(char *)
p是指向字符串首个字符的指针
char s[]="ABC";
s="def"出错
虽然左边的数组名会被解释为数组起始元素的地址,但依然不能改变其值。如果可以赋值,就会改变数组的地址,也就代表着数组在内存空间上移动了。
char *p="ABC";
p="DEF"正确