只读变量
只能读取不能编写,人为编写导致程序报错的变量称为只读变量。
初始化格式:const 变量类型 变量名 =
const int r=1;
↑ ↑ ↑
只读语法 类型 变量名
这里要注意的是,并非const将内存空间的属性变成只读,数值依然可以修改,但需要指针。
const int i=10;
int *p;
p=&n;
*p=20;
printf("%d",i); //输出20
基于指针可以绕过const,需要对指针也作出限制,因而有了只读指针变量和只读变量指针。
只读指针变量 只读变量指针
只读指针变量:意思是只读指针的变量
只读变量指针:只读变量的指针
指针对于变量只读性的赋予取决于*的位置
int*const p2=&a;
*p2=10
在变量和*之间加入了const 构成只读指针变量,此时指针变量被const修饰,此时指针不能指向其他变量,否则会出错,但可以通过指针调整a的值。
int const*p=&a
*p=b;
在指针左边插入const,此时指针的值被限制不能改变,但可以指向其他向量
int const*const p4=&a;
const修饰了类型和指针本身,不能指向其他变量,也不能调整指针的值
特殊指针
硬编码赋值指针
NULL
野指针
void
动态内存分配
之所以存在动态内存分配的概念,是因为对内存的分配路径有认识,定义变量时就已经给变量分配了空间,但大部分时候函数对内存的需求是不确定的,需要手动申请,通过指针的方式使用空间。因此出现管理内存的函数以动态地分配空间。
栈区堆区的区别
栈区由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
需要程序员自己申请,并指明大小,例如:
int *ar=NULL;
int *tr=NULL;
ar=malloc(sizeof(int)*20);
tr=malloc(sizeof(int)*40);
上述给指针ar分配了20个整型存储单元,给指针tr分配了40个整型存储单元