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指针指向常数abdor表示把常量首地址给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.动态内存的分配与使用

栈区:系统自动定义及释放。定义变量时占用,变量不用时即释放

[目前所学的在函数体内定义的变量皆在该区]

特点:容量12M,速度快

堆区:唯一需要程序员管理的内存。

常数区:常数不重复,地址唯一,生命周期与程序同步

全局区:未初始化的全局变量默认为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); //给一级指针分配内存,利用循环,给每一行分配列

}