11.字符串
字符串末尾默认放\0 ,
对于数组而言,未初始化部分自动放\0
%s打印时,遇到\0停止。
arr的只有6个空间,放不下\0 越界访问遇到\0才停止
所以要特别注意\0的问题,防止越界
对于arr数组,是不包含\0的,strlen求字符串长度,遇到\0才停止,所以越界访问了!
strlen是库函数,求字符串长度,\0是字符串的结束标志,不算进长度
问:数组acX的长度比acY的长还是短?
char acX[] = "abcdef" char acY []= {'a','b','c','d','e','f'} 复制代码
->长度:acX>acY 因为问的是数组的长度,不是字符串的长度,不能按strlen的方式算。
acX比acY多放进去\0,所以acX长度比acY长
12.转义字符
转义字符:转变意义
如:\n 换行 \t :相当于tab键
三字母词:
如: ??) 被翻译成] ??( 被翻译成[
问:如何打印单引号,双引号,%d
printf("%c ", '\''); //打印单引号 用\将'转义 printf("%s ", "\""); //打印双引号 用\将”转义 printf("%%d "); //打印%d printf("%c ",'\\'); //打印\ 用\将\转义 复制代码
printf("%c\n",'\065'); //’5‘ // 0ddd ->八进制表示方法 // 八进制数字065转化为10进制后的值作为ASCII值代表的字符被打印 //8进制的065 ->10进制:53 对应字符5 //相当于 printf("%c\n",'5'); 复制代码
printf("%d ", 032); // 0ddd是八进制 printf("%d ", '\32'); // 三种写法都一样 \32也是八进制 printf("%d ", '\032'); // /ddd 不一定需要三位 //打印结果:26 3*8^1 + 2* 8^0 = 26 复制代码
13.注释
/* */ C语言风格的注释
// C++风格的注释
注意:/*不能嵌套注释
14.extern声明外部变量
使用另一个源文件中的变量
要先声明:
如: extern int g_val; 再使用
15.操作符
! : 逻辑反操作
if(!a) //a不为真才进入if语句 即a为假进入if语句 { } if(a) //a为真进入if语句 {} 复制代码
~ :对二进制序列按位取反
整数在内存中存储的时候,存储的是二进制补码 一个整数的二进制表示有三种形式:原码,反码,补码 正整数:原码反码补码相同 负整数:原码反码补码需要计算, 反码 :符号位不变,原码按位取反 补码:反码+1 对于有符号整数:最高位为符号位 符号位为0:表示正数 符号位为1:表示负数 复制代码
以%d形式打印,把真实值取出来,内存中存的是补码,我们真实能够读懂的是原码,内存中是补码时,我们要将补码转化为原码才是真实值
对补码求补码就是原码 ,或者逆序 补码-1->反码->按位取反->原码 (针对负数)
内存中,二进制为全1时,代表的是十进制 -1
16.关键字
auto-自动变量
//局部变量自动创建自动销毁,本质上是 自动变量 int main() { int a = 10; //相当于auto int a = 10; 只是把auto省略了 } 复制代码
break-----用于循环或者switch
const-------常属性
continue ------用于循环。不可用于switch
enum-----枚举关键字
extern-----用来声明外部符号
register---寄存器
return -----返回函数
sizeof ----计算变量所占内存空间大小
static----静态,修饰变量,函数
struct---结构体关键字
typedef---类型重定义
union -----共用体
void---空类型(无类型)
volatile----易变的--linux
寄存器
计算机上的存储空间:寄存器,高速缓存(cache),内存,硬盘,网盘。都是不同的存储空间
关于register
register int num = 100;//只是建议把100存放到寄存器中,由编译器最终决定是否放入寄存器 int a = # //错误,因为&,取出的是内存的地址,num被放入寄存器中,寄存器是独立于内存的空间,所以不能取地址。