这篇算总结+备忘吧!
缓冲区 :缓冲器为暂时置放输出或输入资料的内存。
一、全局变量和局部变量
- 局部变量是指在函数内部声明的变量,它的作用域只在此函数中(main()函数也是函数,不要弄错)。
- 全局变量是在函数外声明的变量,作用域是该文件,可以被本程序中其他函数所共用。
- 全局变量可不进行初始化,他会自动初始化为0,当局部变量名与全局变量名相同时,在该函数内使用的是局部变量。
二、指针
指针:一个变量的在内存区中的地址称为指针
指针变量:专门用来存放指针的变量,称为指针变量
以上是基本概念,指针就是地址,通过地址可以找到地址对应的值
int *p; 定义指针变量
int a;
int *q = a; <==> int *q; q = &a;
(*q)++ <==> a++;
但是 *q++ 不等价于 (*q)++ 而是等价于 *(q++)
两个地址运算符
- & : 当后跟一个变量名时,&给出该变量的地址。
- * : 当后跟一个指针名或地址时,*表示给出储存在指针指向地址上的值
2.1 指针和数组
数组a[10],a为数组a的首地址
int a[10],*p=a;
a[i],p[i],*(a+i),*(p+i)表示的值相同
(p+i) == p+i*sizeof(int)
指针与二维数组
a[i]和*(a+i)无条件等价
a+i、a[i]、*(a+i)、&a[i][0]均表示第i行首地址;
&a[i][j]、 a[i]+j、*(a+i)+j都是第i行j列元素的地址;
a[i][j]、 *(a[i]+j)、*(*(a+i)+j)都是第i行j列元素的值
2.2 指针和结构体
结构体变量的指针:结构体变量所占内存段的起始地址。
指向结构体变量的指针:存放该地址的变量叫做指向结构体变量的指针变量。
struct student{
int num;
char name[10];
};
struct student stu;
struct student *p;
p = &stu;
(*p).num等效于p–>num
结构体变量中成员的引用有三种形式:
(1) 结构体变量.成员名;
(2) (*p).成员名;
(3) p–>成员名;
typedef 是用来定义各种类型名,不能定义变量
2.3 指针和函数
函数的类型是由函数的返回值决定的,所以指针函数就是返回值为指针
函数指针:函数的入口地
扫描二维码关注公众号,回复:
1640950 查看本文章
void *fuctionname(int arg)
void (*fuctionname)(int arg) //一个已定义的函数在编译时,系统为其分配一个入口地址,并用函数名表示。通过指向函数的指针变量,也可以调用函数.指针变量: 指向函数入口地址的指针变量
三、c语言程序的内存映像
堆和栈都是一种数据结构,栈是一种先进后出的数据表,具体的操作就是压栈(push)和弹栈(pop),堆就是申请空间和释放空间。
- 堆和栈区别
- 堆是由程序员申请,也必须由程序员释放。栈是由程序自动分配,自动释放
- 生存周期堆是由程序员决定的(啥时候申请啥时候释放),而栈是和调用的函数的生存周期决定的
- 堆和栈的发展方向也不同,如图示
四、动态内存分配的函数
4.1 函数malloc():分配若干字节的内存空间,返回一个指向该内存首地址的指针
函数原型
void *malloc(unsigned int size); //size表示向系统申请的空间大小,函数调用成功返回指向void类型的指针
例如:
int *pi = NULL;
pi = (int *)malloc(3); //malloc(3)表示申请3byte的内存,将malloc(3)返回值的void * 类型强转为int * 类型
pi = (int *)malloc(sizeof(int)); //若不确定某种类型所占字节数,则使用sizeof()计算
4.2 函数calloc():给若干同一类型的数据项分配连续的存储空间并赋值为0
函数原型
void * calloc(unsigned int num,unsigned int size);
例如:
int *pi = (int *)calloc(3,sizeof(int));
or
int *pi = (int *)malloc(3 * sizeof(int));
memset(pi,0,3 * sizeof(int));
4.3 函数free():释放向系统申请的存储空间
函数原型
void free(void *p);
4.4 函数realloc():改变原来分配的存储空间的大小
函数原型
void *realloc(void *p,unsigned int size);
数组和链表
内存结构
数组名就是指向数组第一个位置的地址
未完,想到了在写!