1、安全的字符串读取和输出的函数 读入字符串的方法: 1) scanf 缺点:不能接收空格 2) gets 优点:可以接受含有空格的字符串 3) fgets(); 优点:可以帮我们根据数组的长度自动截取适当的长度保存 使用格式:fgets(ch,sizeof(ch),stdin);
输出字符串的方法: 1) printf() %s 缺点:不能自动换行 2) puts() 优点:可以自动换行 3) fputs(); 不可以的自动换行 使用格式:fputs(ch,stdout); //stdout表示输出
2、const修饰符的使用 作用:const作用可以把变量变成只读的(常量) 1)修饰变量 const int a=23; a = 20; (错误的) 2)修饰指针 const int *p; //指向可变 ,值不能变 int const *p; //同上 int * const p; //指向不可变,值可变 const int* const p;// 指向和值都不能变
技巧: const 在 * 的左侧 指向可变,值不能变 const 在 * 的右侧 指向不可变 值可变 const 在 * 的两侧 指向和值都不可以变
3、C语言中的内存管理 内存分为5大区域 栈区 -- 存放局部变量,临时变量 堆区 -- 程序运行过程中,动态分配的内存 BSS区 -- 未初始化的全局变量和静态变量 数据段 -- 已经初始化的全局变量和静态变量 代码段 -- 程序编译产生的二进制的数据
4、动态内存管理 1) malloc (void *)malloc(n) //动态的向内存申请连续的n个字节 返回的是新申请的内存空间的首地址 int *p = (int *)malloc(100); //p是在栈区 malloc(100) 在堆区 malloc不会把新申请的空间初始化 memset(p,0,100); //全部初始化为0
2) calloc int *p = (int *)calloc(5,4); //申请5个长度为4的空间 calloc可以把新申请的空间初始化0
注意:判断一个空间是否申请成功 if(p!=NULL){ //只有申请成功了,才能操作 }
3) realloc 重新改变一块内存空间的大小 p = (int *)realloc(p,size);
4) free 释放我们指定的内存空间 free(p); //p是我们新申请的内存单元 free后,p是一个野指针 如果不释放,造成内存的泄露
5、指针和函数之间的关系 1)返回值是指针的函数 指针函数 char * getday(){ return "星期一"; }
2)函数指针 指向函数的指针 格式:返回值 (*指针变量名)(函数的参数); int sum(int a,int b){ return a+b; }
格式一:int (*p1)(int a,int b); // 函数指针p1 只能指向返回值是int类型,并且有两个int 类型参数的函数。 格式二:int (*p2)(int,int);
技巧: 声明的格式:int sum(int a,int b); int (*p3)(int a,int b) = sum; p3 = sum;
6、结构体 什么是结构体? 答:若干个相同或者不同类型的数据组成的新的类型
如何定义结构体 struct 结构体名{ 成员列表; 格式: 类型 变量名; };
7、什么是结构体变量 结构体变量特点: 一个复合类型,具备结构体的特性 struct stu{ int age; }stu1,stu2;
//匿名结构体 struct{ int model; }s1;
//先定义结构体,后定义变量 struct stu stu3;
8、如何初始化结构体变量 初始化的时候,注意成员的顺序 1) struct stu{ int age; char name[20]; }stu1={23,"sss"}; 2) struct stu stu3={18,"sb"}; 3) struct stu stu4; strcpy(stu4.name,"xxxx");//stu4.name="xxx"; 访问姓名 stu4.name // 结构体变量.成员名 访问age stu4.age
9、 结构体存储空间 结构体在内存中占用的存储空间是 所有元素占用空间之和(考虑对齐) 1.逐个元素对齐(下个元素与上个元素对齐) 2.整体对齐(最后的和能单独整除所有元素)
|