Auto和typedef
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> typedef unsigned int u_int; typedef unsigned long long u_ll; typedef struct Node { int data; struct Node* next; }Node;//struct Node - 别名 - Node int main() { auto int num = 0;//通常局部变量省略auto关键字 //局部的变量是进入作用域创建,出了作用域销毁了,自动创建自动销毁 unsigned int num = 0; u_int i = 0;//类似于取别名 //unsigned int - 别名 - u_int return 0; }
static
1.修饰局部变量
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void test() { /*int a = 5; a++; printf("%d ", a);*/ //6 6 6 6 6 6 6 6 6 6 ? //a是局部变量,出了作用域就被销毁,空间就会还给操作系统 //每次重新调用函数a就被重新初始化 static int a = 5; a++; printf("%d ", a); //6 7 8 9 10 11 12 13 14 15 //a是静态变量,作用域不变但生命周期增长 //出了函数并不会被销毁 //static修饰局部变量的时候 //本来一个局部变量是存放在栈区的,如果被static修饰就存储到静态区了 //static 修饰的局部变量改变了变量的存储类型(位置),使得这个静态变量的生命周期变长了,直到程序结束才结束 } int main() { int i = 0; while (i < 10) { test(); i++; } return 0; }
2.修饰全局变量
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> extern int g_val; int main() { //static修饰全局变量 printf("%d\n", g_val); //在test.c定义变量int g_val = 10;本程序不可使用 //声明外部符号 - extern - 就可以使用该变量了 //全局变量具有外部链接属性,所以在其他源文件内部依然可以使用 //当static修饰时 //static int g_val = 10; //但此时printf("%d\n", g_val);报错:无法解析的外部符号 //why? //static修饰全局变量改变了全局变量的链接属性,由外部链接属性变为内部链接属性 //这个静态变量只能在自己所在的源程序内使用,不能在其他源文件使用了 //作用域变小了 return 0; }
3.static修饰函数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> extern int Add(int x, int y); //static修饰函数和static修饰全局变量是一样的 //函数是具有外部链接属性的,但是被static修饰后,就变成了内部链接属性 //使得这个函数只能在自己所在的源程序内使用,不能在其他文件内部使用 int main() { int a = 5; int b = 5; int s = Add(a, b); //当Add被static修饰,此时报错:无法解析的外部符号 Add printf("%d", s); return 0; }
内存中的三个区域:
栈区:局部变量,形式参数
临时作用的变量都是在栈区,栈区上的变量的特点:进入作用域创建,出了作用域销毁(还给操作系统)
堆区:动态内存开辟(malloc、free)
静态区:全局变量、静态变量、静态区变量的特点:创建好后,直到程序结束时才销毁(还给操作系统)
register和电脑上产生的数据存放的位置
寄存器
寄存器指的是计算机中的一组内部存储器件,它们被用来存储CPU中需要频繁使用的数据以及指令。
寄存器的作用是在CPU执行指令时可以更快地获取和处理数据,提高运行效率。 通常情况下,寄存器被视为最快的存储器,因为它们直接连接到CPU,而且它们的读写速度非常快。计算机中的寄存器分为多种类型,包括通用寄存器、特定用途寄存器等等。通用寄存器可以用于存储任何类型的数据,而特定用途寄存器则有特定的功能,例如程序计数器指向CPU当前正在执行的指令地址、指令寄存器存储CPU正在执行的指令等等。
总之,寄存器是计算机中非常重要的组成部分,它们的存在可以极大地提高CPU的运行效率和计算速度。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { //register用来加快变量的读写速度 //不建议大量使用,大量使用造成后续变量访问速度慢 register int num = 10; return 0; }
缓存
缓存是计算机中用于加快数据读取速度的一种临时存储器件。它是位于CPU和主存储器之间的一层存储,通常由高速、低容量的静态随机存取存储器(SRAM)构成,其目的是为了缓存CPU频繁使用的数据和指令,以便快速地读取它们。
缓存的工作原理是将最常用的数据存储在更快的存储器中,这样当CPU需要访问这些数据时,就可以更快地读取它们,而不必从主存储器中读取。由于读取缓存比读取主存储器的速度快得多,因此使用缓存可以大大提高计算机的性能和响应速度。 在计算机中,通常有三种不同级别的缓存:一级缓存(L1 Cache)、二级缓存(L2 Cache)和三级缓存(L3 Cache)。一级缓存是位于CPU内部的最小高速缓存,其容量较小,但速度很快。二级缓存位于CPU和主存储器之间,容量更大但速度比一级缓存稍慢。三级缓存通常是一个独立的芯片,与CPU和主存储器相连,其容量最大但速度最慢。
总之,缓存是计算机中非常重要的组成部分,在提高计算机性能方面起着至关重要的作用。
内存
内存指的是计算机中存储程序、数据和操作系统的临时存储器件,也被称为随机存取存储器(RAM)。内存是计算机中非常重要的组成部分之一,其作用是存储正在执行的程序和数据,以及操作系统需要的信息,从而为CPU提供快速的读写数据和指令的能力。
内存是与CPU直接相连的存储器,其容量大小可以根据计算机的需求进行扩展。内存分为主存储器和辅助存储器,主存储器是计算机可以直接访问的存储器,通常以双倍字节(Double Byte)或四倍字节的方式进行组织。辅助存储器则是用于长期存储数据和程序的设备,通常包括硬盘驱动器、光盘、U盘等。 内存可以被视为计算机中的工作台,当CPU需要执行程序或者访问数据时,会先将这些数据和指令从辅助存储器中读取到内存中,然后再由CPU读取和处理这些数据和指令。由于内存是计算机中非常重要的存储器,因此它的读写速度和容量大小都对计算机的性能和响应速度产生影响。
总之,内存是计算机中非常重要的组成部分之一,其作用是提供给CPU快速读写数据和指令的能力,从而为计算机提供高性能和快速响应的能力。
硬盘
硬盘是计算机中用于存储数据和程序的主要设备之一,它是一种非易失性存储器,通常被安装在计算机的机箱中。
硬盘的作用是将数据以磁盘形式保存在其内部,以便长期存储数据、备份数据和程序等。 硬盘由多个盘片和磁头组成,其中盘片是通过高速旋转的电机驱动的,而磁头则用于在盘片的表面上读取和写入数据。硬盘的存储容量通常以千兆字节(GB)或者兆字节(MB)为单位,容量的大小决定了硬盘能够存储的数据量。 与内存不同的是,硬盘是一种非易失性存储器,存储在硬盘上的数据将会一直存在,即便计算机关闭或者断电,数据也不会丢失。此外,硬盘的容量通常比内存大得多,可以存储更多的数据、文件和程序。
总之,硬盘是计算机中非常重要的存储设备之一,它提供了长期存储数据和程序的能力,其容量大小和读写速度对计算机的性能和响应速度产生影响。
网盘
网盘是一种基于互联网的存储服务,用户可以在互联网上上传、存储和分享文档、照片、音乐、视频等文件。
网盘通常通过浏览器或专门的客户端软件来进行访问和使用,用户可以通过账户登录网盘,将需要上传的文件拖动到指定区域中即可实现上传。上传完成后,用户可以通过链接或者密码分享文件给其他人。网盘与传统的本地存储设备不同,它将用户的文件存储在云端服务器上,用户可以随时随地通过联网访问自己的文件。由于网盘的存储容量通常比本地存储设备更大,因此用户可以在网盘上存储更多的文件。网盘的优点是方便、高效、节省空间和易于分享。用户可以随时随地访问自己的文件,无需担心文件存储空间不足或者丢失的问题。此外,网盘提供了安全的数据备份和共享功能,可以为用户的日常工作提供很大的便利。
总之,网盘是一种基于互联网的存储服务,为用户提供了方便、高效、节省空间和易于分享的存储方式,其优点在当前互联网使用频繁的环境下更加突出。
从上往下,空间越大,速度越慢,造价越低。
#define定义常量和宏
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //#define定义常量和宏 #define M 100 //常量 #define ADD(x,y) ((x)+(y)) //宏 // 名字 参数 宏的实现体 int Add(int x, int y) { return x + y; } //函数 // 返回类型 名字 参数 函数体 int main() { //#define定义常量 int arr[M] = { 0 }; int m = M; printf("%d\n", sizeof(arr) / sizeof(arr[0]));//100 //#define定义宏 int a = 10; int b = 20; //int c = ((a)+(b)) - 替换 int c = ADD(a, b); printf("%d\n", c); int d = Add(a, b); printf("%d\n", d); return 0; }
结构体关键字struct
学生:名字+年龄+性别
书:书名+作者+定价
类似与这些多个复杂的对象,C语言的内置类型无法无法表示这样复杂的数据,于是C语言就提供了结构体struct来描述复杂对象
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> // struct 结构体 struct Stu { //学生的相关属性 char name[20];//名字 - 字符串 - 一个汉字两个字符 int age;//年龄 char sex[5];//性别 }; struct Book { char name[20]; char author[10]; float price; }; int main() { struct Stu s = { "张三",18,"男" }; struct Book b = { "数据库","保密",16.5 }; //获取书名,作者,价格 printf("%s %s %lf\n", b.name, b.author, b.price); return 0; }
一个汉字仅仅只占用两个字节
一个汉字占用两个字符是因为在计算机的存储和处理中,一个汉字需要使用两个字节(也就是16位)的空间来进行存储和处理。
这是因为汉字的数量相对较多,若将每个汉字用一个字节来表示,则只能表示 256 个汉字,显然无法满足中文处理的要求。 Unicode编码是目前最为广泛使用的编码方式,它将世界上的所有字符(包括拉丁字母、汉字、日文假名等)都赋予了一个唯一的编码,以16位的二进制数字来表示每个字符。由于汉字数量很大,所以16位(即两个字节)的空间可以表示数以万计的汉字,从而保证了计算机能够更好地处理和存储中文数据。
因此,一个汉字在计算机中占用两个字符,这是为了能够更好地满足汉字的存储和处理需求,同时也是因为Unicode编码所需要的空间大小为16位(即两个字节)。