【REVIEW_C】【持续更新】
目录1. 在终端给main传参2. 文件路径3. 头文件4. 涉及到内存概念5. 32bit系统地址总线6.常量和变量7.命名规则8. C语言不支持二进制输入9.计算机区分整数的正负10. float、double11. 字符串12. 头文件路径13. printf14. 大端小端15. 缓冲区16.变量17.数组 *( E1 E2 )18. * 19.变量data的本质20.数值的两个特殊情况1. 在终端给main传参在终端的输入无论是”./demo”还是”./xxx”还是”./xxx hello”都是字符串。数组中第一个元素的字符串指的都是程序的名字。argc的值是非负整数。数组中的每个元素都是一个指针char* argv[]是个指针数组数组的每个元素都是一个指针指针指向的地址下的数据都是字符串char* 。字符串由命令行终端传递给main函数。数组中的第一个元素的字符串是程序的名字。数组中的第二个元素到最后一个元素是传递给程序的参数。2. 文件路径标准库/第三方库存放在“lib”中。头文件存放在“include”中。3. 头文件官方提供的函数库都已经在系统路径中能够是存在的所以用户需要使用包含头文件就可以让编译器找到对应的函数接口。 xxx.h 编译器只去系统指定路径中查找该头文件如果未找到则编译器进行错误提示。“ xxx.h ” 先去当前路径中查找头文件未找到再去系统路径中查找还未找到则报错提示。4. 涉及到内存概念Q : 计算机把还未处理的数据以及处理好的数据保存到哪里呢A 这些数据都是存储在存储器用户通过输入设备键盘录入的数据都是先存储在内存中然后控制器会把这些数据传递给运算器运算器处理完成后传递给控制器控制器把数据传递给输出设备显示器。5. 32bit系统地址总线32bit系统 or 64bit系统 指的是计算机的地址总线的位数指的是计算机的寻址范围是32bit存储单元地址:0x00000000~0xFFFFFFFF。内存属于易失性存储设备,键盘输入的数据是先存储到内存(随机存储器RAM)中存储器中有n个存储单元每个在储单元的大小都是1字节。存储单元大小是1字节32bit系统的存储单元的地址是4字节64bit系统的存储单元的地址是8字节。6.常量和变量常量在程序运行期间值不会发生改变的量变量在程序运行期间值可能发生变化的量量指的是存储器中的存储单元。常和变存储器中存储单元里数据的状态。常就是数据的状态不会变变就是数据的状态会变7.命名规则变量和常量也被称为标识符标识符是由字母、数字、下划线以及美元符号$组成并且标识符的第一个字符只能是字母或者下划线。C语言的标识符是区分大小写8. C语言不支持二进制输入但是C语言支持八进制、十进制、十六进制。规定八进制的前缀以0表示比如064规定十六进制的前缀以0x/0X表示比如0x64。9.计算机区分整数的正负思考计算机可以区分整数的正负但是程序最终都会被转换为二进制指令但是二进制是不分正负的请问编译器是如何转换数据的回答二进制可以分正负在二进制数的前面添加1bit作为符号位并且bit0用于表示二进制数为正数bit1用于表示二进制数为负数。正数符号位为0时的原码和补码是相同的所以负数才需要把原码转换为补码再进行存储127 →0000 00000000 00000000 00000111 1111(原码、反码、补码)128 →0000 00000000 00000000 00001000 0000(原码、反码、补码)→ 特殊数值→ -128129(B) →0000 00000000 00000000 00001000 0001(原码、反码、补码)由于是32bit系统并且129是常量且数值较大所以操作系统给129的宽度是四字节的int。129存入四字节的空间为正数正数的原码、反码、补码都是原码本身。由于赋值给char类型从低位开始写入所以只能写入后8位最高位是1cpu就认为这个值是负值符号位为1。——读出—→1000 0001((补码)→1000 0000(【-1】反码)→1111 1111(原码)→-127先把常量转换为二进制补码再把二进制补码往存储单元里放。常数130存入时先转成补码再存入。130为正数原码反码补码都是一样的。0000_0000 0000_0000 0000_0000 1000_0010但是char只能取低8bit所以存入 1000 0010读出时先取出补码再转成原码。补码为 1000 0010 发现符号位是1判定他是负数。反码 1000 0001原码 1111 1110 -126按上述计算常数128经过转补码写入再读出补码1000 0000补码 -- 属于数据类型中非常特殊的存在可以计算是 -0但是0不分正负所以 把-0的位置用-128进行替换。原码首位为标志位1表示负数0表示正数。反码 原码的标志位不变其他取反。补码 反码1正整数的原码、反码、补码相同。cpu将数字常量存储到存储单元中存储的是数字常量的补码正数的补码是正数本身负数的补码要通过计算读出数据时操作系统先读出补码再把补码换成反码反码换成原码-1后0变1、1变0写入先转再放先将常量转换为二进制补码再将二进制补码由低位到高位写入空间中读出先读再转先将二进制补码读出再转为十进制数10. float、double关键字float来表示单精度浮点数float占4字节关键字double用来表示双精度浮点数double占8字节C语言也提供了一种类型long double该类型占16字节。11. 字符串字符串在内存是需要一块连续的内存空间进行存储字符串的结束标志是’\0’12. 头文件路径stdio.h标准输入输出。在linux系统下stdio.h的位置在/usr/include/stdio.h13. printfprintf函数的返回值 被输出的字符的数量(是不包含\0)当错误发生时返回一个负整数#o可以把八进制的前导符输出#x可以把十六进制的前导符输出 -- 0xhh 指的是把整型转为字符型 只是针对输出内容而言数据本身没有受到影响h 指的是把整型转为短整型 只是针对输出内容而言数据本身没有受到影响0标志flag表示当输出宽度大于实际数字位数时用零填充左侧空位。.2精度precision表示至少输出2位数字如果数字位数不足2位则在左侧补零。printf(%0.2d, 5); → 输出 05精度要求两位补一个零。printf(%0.2d, 123); → 输出 123数字位数已超过精度原样输出。printf(%05.2d, 5); → 输出 00005 (宽度5精度2实际输出数字至少两位再补零到5位)14. 大端小端X86架构一般采用小端模式ARM架构一般采用大端模式15. 缓冲区全缓冲指的是当缓冲区被填满就立即把数据冲刷到文件、或者在关闭文件、读取文件内 容以及修改缓冲区类型时也会立即把数据冲刷到文件一般读写文件的时候会采用无缓冲指的是没有缓冲区直接输出一般linux系统的标准出错stderr就是采用无缓冲 这样可以把错误信息直接输出。行缓冲指的是当缓冲区被填满一般缓冲区为4KB就是4096字节或者缓冲区中遇到 换行符’\n’时或者在关闭文件、读取文件内容以及修改缓冲区类型时也会立即把 数据冲刷到文件中一般操作IO设备时会采用比如printf函数就是采用行缓冲。刷新缓冲区的方法执行过程中遇到换行符”\n”程序正常执行结束执行过程中出错程序直接报错 → 无缓冲区调用输出刷新函数fflush()当前页缓冲区填满当前行缓冲区填满16.变量变量是在程序中由内核申请的一块内存允许用户对这块内存进行命名。这样内核就可以把内存地址和变量名称建立映射关系所以用户可以直接通过名称访问变量。17.数组 *( E1 E2 ) 地址运算符取地址* 间接运算符间接访问解引用*( E1 E2 )的解释E1是数组对象E1是数组名称C语言标准中规定 数组名表示数组中首元素的地址。 E1 是数组中首元素的地址而E2是一个整数 E1 E2 从E1这个地址向后偏移E2个元素单位以元素为单位需要考虑元素的类型 E1E2的结果还是一个地址。*( E1 E2)相当于间接访问该地址相当于得到了(E1E2)这个地址下的值。总结*(E1E2) E1[E2]E1[E2] *(E1E2) *(E2E1) E2[E1]18. * *操作数 操作数必须是地址 *地址 可以得到该地址的数据E1[E2] *(E1E2)(*(E1E2)) *互相抵消 (E1E2)操作数 操作数可以是表达式 操作数 可以得到该操作数的地址*E E假设E是一个变量名*E E先结合得到了变量的地址 *(E)可以得到该地址下的值变量名本身就表示地址下的数值int a[] { 1, 234};printf(%d\n,sizeof(a)); //32bit系统下为4字节。a表示数组本身的地址19.变量data的本质//申请内存时可以把操作系统提供的存储单元的编号可以进行命名int data ;//对变量赋值。data 可以得到变量名data对应的存储单元的地址。*(data)可以得到该地址的值只不过*互相抵消data 20 ;*data 30 ;20.数值的两个特殊情况第一种情况 当 数组名 和 地址运算符 一起使用时数组名表示数组本身的地址所以1的动作是向后偏移整个数组的大小。第二种情况当 数组名 和 sizeof()运算符 单独使用的时候数组名表示数组本身。注意sizeof在C语言中是一个操作符作用是计算数据类型的大小结果以字节为单位sizeof括号中的表达式是不会实现运算和处理的。