1.静态变量
1.在程序执行只会被初始化一次 ,但是可以被多次赋值 2.在另外的文件中不能使用 ,static修饰的变量只能在本文件中使用
3.未初始化的 静态变量与全局变量 初始值为0 4.
#include<stdio.h>
#include<Windows.h>
extern int b=10;
void func(){
static int a=10;
printf("%d \n",a++); 10 11 12 13 14 15 16 17 18 19
}
void main(void) {
for (int i = 0; i < 10; ++i) {
func();
}
return; }
3.使用 extern 声明,然后可以使用一个项目中的文件的变量(static除外)或者函数,
2.内存四块模型
3.malloc 开辟堆内存
void main(void) {
char *p = malloc(sizeof(char)*10); 创建10个大小的堆内存
strcpy(p,"hello world");
char *p1 = "hello world";
char *p2 = "hello world";
printf("%p \n",p); 0000000002A01400
printf("%p \n",p1); 0000000000404000
printf("%p \n",p2); 0000000000404000
free(p);
return;
}
1.p1 和 p2都是字符常量区的字符串,所以地址一样的, p是 malloc 函数 创建10个char类型大小的堆内存再拷贝的内存不一样
2. memset(p,0,10); 使用memest重置一块内存的值 参数: 目标 , 重置的值, 重置大小 上面是 1*10个 值最好是0
2.memest
可以重置栈空间中的数组值, 大小为4 *5=20
int arr[] = {1,2,3,4,5};
memset(arr,0,20);
for (int i = 0; i < 5; ++i) {
printf("%d \n",arr[i]); 0 0 0 0 0
}
3.memcpy, memove
1.拷贝 一个内存中的值到另一个内存中去, 拷贝5个int类型的大小 ,拷贝重复的内存地址会报错, 而memove不会报错
2.memcpy拷贝结束标志是看 个数, 而strcpy拷贝结束是以字符串 \0为结尾
int arr[] = {1,2,3,4,5};
int *p = malloc(sizeof(int)*5);
memcpy(p,arr,20);
for (int i = 0; i < 5; ++i) {
printf("%d \n",p[i]); 1,2,3,4,5
}
4.memcmp
比较两个内存中的值.可以指定个数比较. 相同返回0 不同返回-1
int arr[] = {1,2,3,4,5};
int arr2[] = {1,2,3,4,5};
int a =memcmp(arr,arr2,5); 0