| 
 
| 1、fgets() 该函数一个文件操作相关的函数
 
 暂时使用这个函数可以从键盘商接收一个字符串,保存到数组中
 
 原来接收字符串保存到数组中的方法
 
 char str[50];
 
 1) scanf("%s",str);  //缺点:不能接收空格
 
 2) gets(str);        //优点:可以接收空格
 //会有一个警告,不安全的
 //不安全:比如数组长度是50,如果我们输入的
 //的长度正好是50个,此时把50个字符全部存到
 //数组中,存在问题 因为没有空间存放字符串结束符
 
 fgets()是一个安全的字符串接收的函数
 
 char ch[5];  //如果使用fgets此时数组中最多存放4个可见字符
 //会自动的把数组的最后一个元素存放\0
 fgets()使用格式:
 fgets(数组名,数组长度,stdin);//std 标准 in 输入
 fputs();也是一个文件操作相关的函数
 格式:
 fputs(数组名,stdout);
 
 
 #include <stdio.h>
 #include <string.h>
 
 int main(int argc, const char * argv[]) {
 
 char ch[5];
 //fgets从输入缓冲区读取一个字符串保存到字符数组中
 //当输入的字符串的长度大于数组的长度,此时fgets会自动的
 //把数组的最后一个元素变成\0
 //当输入的字符串的长度小于数组长度的时候,fgets还会接收回车
 fgets(ch, sizeof(ch), stdin);
 //去掉多余的\n
 if(ch[strlen(ch)-1]=='\n') ch[strlen(ch)-1]='\0';
 
 //\n  它的ascii码值10
 for (int i=0; i<5; i++) {
 printf("%d\t",ch[i]);
 }
 
 //fputs是不会自动换行
 //fputs也不能进行格式化的输出
 //puts 可以自动换行
 fputs(ch, stdout);
 //printf("--->%s\n",ch);
 
 
 
 return 0;
 }
 2.fgets(),fputs()优缺点:帮我们自动截取输入的字符串,使得我们队字符串的存取是安全的。
 3.const:
 1)什么是const:是一个类型修饰符,可以让变量的值不能改变。
 2)作用:(1)定义常量
 (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
 (3)可以避免意义模糊的数字出现,同样可以很方便的进行参数的调整和修改。同宏定义一样,可以做到不变则以,一变都变
 (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
 (5)可以节省空间
 (6)提高效率
 3)如何使用const
 const使用的地方
 
 
 1)修饰变量
 
 int a = 10;
 
 printf("%d\n",a);  //10
 
 a = 200;
 
 printf("%d\n",a);  //200
 
 2)修饰指针变量
 
 3)修饰数组
 
 #include <stdio.h>
 /**
 *  const修饰变量,使得变量变成常量
 */
 void test1(){
 
 //使用const修饰变量a
 const int a = 10;
 printf("%d\n",a);  //10
 
 //a = 200;//read-only
 printf("%d\n",a);  //200
 
 }
 /**
 *  用指针强制修改const常量
 */
 void test2(){
 
 
 //使用const修饰变量a
 const int a = 10;
 printf("%d\n",a);  //10
 
 
 int *p = &a;  //
 *p = 100;  //强制修饰常量
 
 printf("%d,%d\n",a,*p);  //
 
 }
 
 int main(int argc, const char * argv[]) {
 
 int a = 10;
 int b = 20;
 
 //定义个指针变量,p指向a
 //此处的const的作用是指针变量p的指向可以改变,但是指向的变量的值
 //不能改变的
 
 //1、const修饰的指针变量指向可变,指向的变量的值不可变
 const int *p = &a; //给p初始化
 p = &b;  //重新修改了p的指向
 //*p = 1000;
 
 int const *p1 = &a;
 p1 = p;  //p1的指向也是可以改变
 //    *p1 = 100;  p1指向的变量的值是不能改变的
 
 //2、const修饰的指针变量,指针变量指向的变量值可以变,指向不能变
 
 int * const p2 = &a;
 *p2 = 2000; //值可以改变
 //p2  = &b;  //p2的指向不能变
 
 //3、const修饰的指针变量的指向和值,都不能改变
 const int * const p3 = &a;
 //    p3  = &b;   //指向不能变
 //    *p3 = 100;  //指向的变量的值也不能变
 
 
 /*
 
 记忆技巧:
 
 看 const 和 * 的位置
 
 如果 const 在 * 的左侧  表示指针变量指向的变量的值不能变,但是指向可以改变
 
 如果 const 在 * 的右侧  表示指针变量指向的变量的值可以改变,但是指向不可以改变
 
 如果 const 出现在 *的两侧,表示指针变量的指向和值都不能改变
 */
 printf("a = %d\n",a);
 return 0;
 }
 4.内存分配方式:有三种
 (1)从静态存储区域分配:在定义的时候已经分配好
 (2)在栈上创建:在执行函数时,函数内局部变量的存储单元都可以在栈上创建
 (3)从堆上分配,亦称动态内存分配:程序在运行的时候分配。Malloc或new
 5.内存的分区:
 
 
 BOSS段:通常是指用来存放程序中未初始化的全局变量和静态变量
 数据段:用来存放程序中已初始化的全局变量和静态变量;字符串常量等
 代码段:存放程序执行代码的一块内存区域
 堆:存放被动态分配的内存段
 栈:存放用户临时创建的局部变量
 
 | 
 |