c基础很薄弱,仅限非计算机专业大学学的那点点基础。以后会每天更新个人的学习笔记。菜鸟的我是这样学下来滴。走过路过的,不许笑话。有缘看见的,欢迎指点。
1.常数区 (由编译器管理)
常数!=常量
char *v="abcd"; "abcd"是常数,保存在常数区,且唯一
[变量放在堆区或者栈区]
注意: a[]="abcd" 其中a[]中值可以改, char *c="abcd" abcd在常数区无法修改
char *d="abcd" char *c="abcd" d地址==c地址 (常量区位置不变且唯一)
栈区的生命周期:即用即生成,用完即释放
常数区的生命周期:初次使用即在常数区创建,与程序生命周期一致。该机制节约内存
char *c; c="abd" c指针指向常数abd,or表示把常量首地址给c
2.指针数组
定义格式 int *p[5];
p[5]中每个元素都是指针
int *p[3]; int d[5][5]; *p={*d,*(d+1),*(d+2)}
3.字符串数组
char name[3][12]={"张三","李斯","往而麻子"};
指针数组指向常数串
char *p[3]={"aaaa","bbbbbbbbbb","cccc"} 注意常串内容不可改,指针指向可以改
4.动态内存的分配与使用
栈区:系统自动定义及释放。定义变量时占用,变量不用时即释放
[目前所学的在函数体内定义的变量皆在该区]
特点:容量1-2M,速度快
堆区:唯一需要程序员管理的内存。
常数区:常数不重复,地址唯一,生命周期与程序同步
全局区:未初始化的全局变量默认为0
代码区:代码--二进制代码运行即分配,生命周期与程序同步
5.堆区的内存管理
特点:a堆区无法命名 b容量取决于使用大小 c容易发生内存泄露,迷途指针(白话==野指针)等问题
管理方法:a给内存分大小 b返回指针首地址 c释放内存
int *p;//此时p在栈区
p=(int *)malloc(sizeof(int)*100);//在堆区给p分配内存()中表示大小;另malloc前可加 强转也可不加。malloc要引用头文件 #include<stdio.h>
free(p);//释放p指向占用栈区内存;注意:释放之后p的指向没有改变
备注:为了避免迷途指针释放后可操作
p=NULL;
重分内存并保证原有数据不变的函数--realloc(原内存首地址,大小)
p=realloc(p,sizeof(int)*4)
分配原理:若之前内存之后没有连续足够大内存,realloc函数首先找到足够大的内存,然后把原地址中数据复制,此时指针指向改变。
realloc(NULL,size)
二级指针分配内存
int **p=(int **)malloc(sizeof(int *)*n); //给二级指针分配内存,返回类型为二级指针,需要强转
for(i=0;i<n;i++)
{
p[i]=(int *)malloc(sizeof(int)*m); //给一级指针分配内存,利用循环,给每一行分配列
}