内存四区:
在C语言中函数默认都是全局的;使用static关键字可以将函数设置为静态的。
使用static修饰的函数只能在本文件中使用。
extern int age; //有一个变量是int型的,名字是age,已经在其他文件中定义了,这里就可以直接使用了.
int age; //定义了一个int型变量,名字是age.
每一个应用程序都有独立的内存区域.
代码区(code):存放可执行的二进制代码.在程序执行的过程中是不会改变的.
堆区:程序动态申请的区域.程序运行过程中其大小是动态.
栈区:存放局部变量.是一种先进后出的内存结构.对于局部变量,什么时候入栈,什么时候出栈,是不需要程序控制的,由C编译器实现.
栈的大小是动态的.
栈溢出:当栈空间已满,但还往栈中压变量,这个就叫栈溢出.栈的空间很小.
全局区(静态区):存放全局变量和静态变量.
对于32位操作系统,最大管理内存是4GB,其中1GB是给操作系统自己用的,剩下的3GB是给应用程序用的.
堆内存的分配与释放:
malloc分配内存; //void *malloc(size_t size);
free释放内存; //void free(void *ptr);
在堆中申请空间是不会自动释放的,必须使用free进行释放.
malloc和free是成对使用的.
堆、栈和内存映射:
定义数组的时候大小必须是常量,不能变量。
栈是从高地址向低地址方向增长的.先进后出.
操作系统在管理内存的时候,最小单位不是字节,而是内存页.
寻找数组中的最大和第二大元素:
第一步:假设数组中的前两个元素就是第一大和第二大元素,max和smax;
第二步:从第2号元素开始遍历比较,当有元素大于max时,smax=max,max=最大的那个元素。
第三步:如果当前元素小于max并且大于smax,则smax等于这个元素.
void max_and_smax(int *arr, int len)
{
int max,smax,i;
if(arr[0]>arr[1]){
max = arr[0];
smax = arr[1];
}else{
max = arr[1];
smax = arr[0];
}
for(i=2;i<len;i++){
if(arr[i]>max){
smax = max;
max = arr[i];
}else if((arr[i]>smax) && (arr[i])<max){
smax = arr[i];
}
}
printf("max = %d, smax = %d\n",max,smax);
}
结构体定义与成员初始化:
结构体的内存对齐模式;
结构体在内存中是个矩形,而不是一个不规则形状。
函数形参中的数组,编译器会把它作为指针来处理。这是C语言的特色。
数据类型的本质:固定大小内存块的别名。
变量的本质是什么?是一段连续内存空间的别名。
指针也是一种数据类型。
字符逆序和逆序打印;
const修饰符的介绍。const修改变量,不会改变变量的作用域。