A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丶有果灬 中级黑马   /  2015-5-15 00:18  /  862 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

动态内存和结构体预处理
1)Const修饰符的作用
Const:
常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能更新的。
Const常类型
变量:值是可以修改的
常量:值是不可以修改的
可以把一个变量通过Const修饰后变成的一个常量。变成只读的,在java中的final与此类似。
修饰常指针:
Const int *A; //Const修饰指针,A可变,A指向的值不能被修改。
Const int a = 10;
int b = 100;
//a=20;
printf("%d\n",a);
//指针的指向(存储的是谁的地址)  值(地址对应的存储单元是/的内容)
//标准指针P1的值指向可以改变的,但是地址所对应的值是不能改变的。
以下四种情况:
(1)Const int *p1 = &a;  //p1-->a
p1 = &b;  //p1-->b
*p1 = 20;   //报错,不能够去访问
(2)int const *p2 = &a;
p2 = p1;
//*p2 = 34;   //报错,也不能修改
(3)//标示指针p3指向的值可以修改,但是指向不能修改
int *const p3 = &a;
p3 = p1;     //报错
*p3 = 100;
(4)//这种写法,标示指针变量,p4指向和值都不能修改
const int * const p4 = &a;
p4 = &b; //报错
*p4 = 200; //报错
技巧总结:
先看"*"的位置
如果const在*的左侧,表示值不能修改,指向可以改
如果const在*的右侧,表示指向不能修改,值可以改
如果"*"的两侧都有const,表示指向和值都不能改动

2)内存的分区:
代码区:存储的代码编译后的二进制的文件
数据区:存储一些程序需要的数据
常量区:全局,静态数据,字符串常量
堆区:系统运行的过程,程序申请的内存空间
栈区:局部变量(特殊的结构,先进后出)
动态的内存分布:
操作堆区:1)常见的函数
#include
#include
int *p = (int *)malloc(sizeof(int));//int *起到强转的作用
//在程序运行的时候,动态内存的分配的存储区域
//判断一下是否成功
if(p!=NULL){
//如果分配的地址,就一个数
*p =10;
}
printf("%d\n",*p);
return 0;
}

3)动态的内存申请
(1)申请运行的过程中向堆区动态申请一块内存区域 void* malloc(n)
//从内存的堆区中申请的n个字节内存 void* 空指针类型
存储整数:
//申请一个4个字节长度的内存区域,首地址放到了p中。
(2)free(指针p)表示回收指针P指向的内存单元,释放的情况作用。
free(p);
p = NULL;
(3)calloc 申请n个长度为size内存基质
int *p = (int *)calloc(4,sizeof(int));
//这种方法取代了数组
(4)memset函数可以完成初始化
函数说明:
memset()会将参数s所指的内存区域前n个字节以参数填入
使用memset设定区域存储的内容(用制定的元素初始化申请的内存区域)
(5)realloc重新修改内存分配的区域大小
realloc(p1,//*sizeof(int));
*(p1+10)=1;
printf("%d\n",*(p1+10));


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马