通过短暂的学习,了解到了指针的3种类型,分别是指针常量,常量指针,指针常量常量指针!
指针常量:
int const *p;
表示P是一个指向常量的指针,这个时候*p的值是不可以被修改的,但是可以让p指向其他的地址。
常量指针:
int *const p
表示指针是一个常量,其本身不可以修改,但是他所指向的值可以修改。
指针常量常量指针:
const int *const p
表示该指针是一个常量,并且它所指向的值也是一个常量,这种情况下其本身和它所指向的值都不可以改变。
举个例子:
int a = 100,b = 200;
int const *p1 = &a; //此时定义为指针常量
*p1 = 100; //尝试修改*p1的值是不合法的
p1 = &b; //可以让p1指向的值改变
=============================================================================
int a = 100,b = 200;
int *const p2 = &a; //此时定义为常量指针
p2 = &b; //此时尝试修改p2的指向是不合法的
*p2 = b; //但他指向的值可以改变
=============================================================================
int a = 100,b = 200;
const int* const p = &a; //此时定义为指针常量常量指针,不可以改变的他的值
p = &b; //这2种操作都是不合法的
*p = b;
====================================================================================================
指针的值都可以认为是一个地址!(数组名本身也就是一个数组,调用函数传参数时可以传a,&a,&a[0]都是合法的)
指针也可以分为一级指针,二级指针等等!!
例如int *p1 = &a,此时*p1就是一个一级指针;int**p2 = &p1,此时p2就是一个二级指针。二级指针只能指向一级指针,不能直接指向a;
再就是指针只能指向已经分配好的内存区域,如果你不想直接初始化时给指针一个值,而是想要提前准备一个空间往里面赋值,我们也
可以提前分配你给内存,借助malloc函数我们可以先开辟一个空间,例如p = (int *)malloc(sizeof(int)*100);就可以理解为我们像计算机
申请了一个占400个字节的区域(因为int一般情况下占4个字节的空间,我们就申请了4*100 = 400个字节的空间)。当然,我们在实际
运用中也有可能发生计算机内存不足的情况,我们可以用if(!p)做个判断来确认计算机是否给我们分配了内存。
还有可能我们提前的内存不够,我们可以使用relloc函数来重新申请分配内存空间。使用方式为:int* realloc(void* ptr, unsigned newsize); 其中参数ptr为原有的空间地址,newsize是重新申请的地址长度。使我们在实际运用中可以灵活分配空间来减少计算机内存的浪费!!