重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
/利用关键字 static修饰的变量叫做静态变量并且存储在静态区
创新互联是一家专注于成都做网站、网站建设与策划设计,德清网站建设哪家好?创新互联做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:德清等地区。德清做网站价格咨询:028-86922220
//特点1 如果你不给初值的话 默认为0
//特点2 只初始化一次
//在main函数上面 是全局静态变量
// 在main函数里面 叫局部静态变量 作用域是大括号内
void function(){
int a =5;
int b =6;
printf("%d,%d",a,b);
}
int main(int argc,constchar * argv[]) {
// 内存划分为5个区域
// 栈区堆区静态区常量区代码区
// 内存地址由高到低
// 学习目标按顺序记忆
#pragma mark --代码区
//电脑的存储都是以二进制数据进行存储的
//咱们写得代码会被系统转化成二进制数据存储代码区
#pragma mark --常量区
//常量区存储的常量特点
//把 h更改成 w
// char *str = "zhuang";
//常量是程序运行期间不能改变量
// str = "haha"; //指针的赋值就是重指向
// char str[] = "zhuang";
// str[1]='w';
//数组名字 地址数组首元素的地址
//数组首元素的常量地址
//是把常量字符串 拷贝到栈区
#pragma mark --静态区
//静态区:存储两种变量
// 1.静态变量
// 2.全局变量
// 3.静态区变量保存周期:直到程序运行结束静态变量才会被释放(伴你到永生)
#pragma mark --栈区
// int num1 = 5;
// int num2 = 10;
// int num3 = 15;
// printf("%p\n",&num1);
// printf("%p\n",&num2);
// printf("%p\n",&num3);
//栈区有多大?
//大概7M-8M
// char str[8187 * 1024] = {0};
//出栈入栈的规则
//先入栈的后出栈 先入栈的 在栈低
//入栈 可以叫压栈
//出栈 的顺序 从栈顶开始出栈
// int num1 =5;
// int num2 = 10;
// int num3 = 15;
// function();
//之所以栈区容量不是特大 又不出现奔溃的现象是因为栈区频繁进行出栈和入栈只要一次性不把栈空间堆满 不会轻易出现崩溃
//定义变量的时候 切记给初值避免出现莫名其妙的问题
#pragma mark --堆区
//堆区是程序员开辟空间是程序员释放空间
//手动开辟空间手动释放空间
//堆区空间大概就是咱们内存全部空间
//开辟空间函数
// void *表示无类型指针可以转换成任何类型的指针
// void *malloc(<#size_t#>)
// size开辟空间大小开辟多少字节空间
//给整型指针p指向的位置 开辟了4个字节的堆内存空间
// int *p = malloc(4);
// *p = 10;
// printf("%d \n",*p);
//
// char *str = malloc(8);
// strcpy(str, "wang"); //正确的
// strcpy(str, "wangwangwang");//错误的,开辟多少空间 就要用多少空间不要超过开辟的空间
// printf("%s",str);
// int *p1 = malloc(4);
// *p1 = 5;
// short *p2 = malloc(4); // 开辟多少空间 最好你就用多少
// *p2 = 10;
// *(p2 + 1) = 15;
//
//释放空间函数
// free(<#void *#>)
// 1 .标记删除 不会抹去该空间存储的数据 只会把这块空间标记为可用
// 2.把指针置为空
//开辟空间
// int *p = malloc(4);
// //使用空间
// *p = 10;
// printf("%d\n",*p);
// //释放空间
// free(p);
// p =NULL;
// int *p = malloc(sizeof(int) * 5);
// for (int i = 0; i < 5; i++) {
// *p = i + 1;
// p++;
// }
// // 指针地址发生变化 释放了本不属于你开辟的区域这时候程序崩溃
//
//
// //修改 把指针移回去
// for (int i = 0; i < 5; i++) {
// p--;
// }
// free(p);
// p = NULL;
//
//**********************************************************************
// char str[] ={"dj5s5f"};
// //计算出有多少个数字
// int count = 0;
// for (int i = 0; i < strlen(str); i++) {
// if (str[i] >= '0' && str[i] <= '9') {
// count++;
// }
// }
// char *strValue = malloc(count + 1);
// int index = 0;
// for (int i = 0; i < strlen(str); i++) {
// if (str[i] >= '0' && str[i] <= '9' ) {
// strValue[index] = str[i];
// index++;
// }
// }
// strValue[index] = '\0';
// printf("%s",strValue);
// free(strValue);
// strValue = NULL;
//
//*******************************************************************
// char *words[3] = {0};
// char str[] = {0};
// for (int i = 0; i < 3; i++) {
// printf("请输入一个字符串");
// scanf("%s",str);
// printf("%lu",strlen(str));
// words[i] = malloc(strlen(str) + 1);
// //保存字符串
// strcpy(words[i], str);
//
// }
//
//
//
// for (int i = 0; i < 3; i++) {
// printf("%s",words[i]);
// free(words[i]);
// words[i] = NULL;
// }
//
// ************************************************************
//其他分配堆内存函数
//在堆内存当中开辟 n * size个空间 并且把开辟的内存空间清零
//因为有一个清零的过程 所有效率偏低
// calloc(int n , size);
//重新分配函数
// realloc(原来分配的地址,新空间大小)
//情况1:如果原来分配的地址 可以扩充空间那么就在原地址扩充
//情况2:如果原来分配的地址 不能扩充了 那么系统会重新分配一个空间 并且把原来地址存储的数据拷贝到新空间里然后系统自动释放原地址的空间
//
// int *p_old = malloc(10);
// int *p_new =realloc(p_old, 15);
// printf("%p %p\n",p_old,p_new);
//
//
//内存操作函数
//把开辟的空间 多少字节 重置成C
// memset(开辟的空间的指针, int c,字节数)
//用途:把开辟好的空间 清零
// int *p = malloc(sizeof(int) * 4);
// for (int i = 0; i < 4; i++) {
// p[i]=i + 5;
//
// }
// //清零
// memset(p, 0, sizeof(int) * 4);
// for (int i = 0; i < 4; i++) {
// printf("%d",p[i]);
// }
//内存拷贝函数
//从来源 拷贝到目的地 多个字节
// memcmp(目的地,来源,字节数)
//内存比较函数
//两个地址 按字节 进行比较 返回第一个不同的差值
// memcmp(指针1,指针2,字节数)