注:个人总结仅代表自己理解,当中可能有些许错误,且有些表达不够清晰或不够准确,欢迎各位大佬批评指正!
一、各种语句
1、switch(整型表达式);case 为整型常量表达式。
2、float定义的值要加0.0f, double只需要0.0即可。
3、strlen()所计算的字符长度不包括"\n",但是sizeof()/sizeof(...)计算的长度包括"\n",sizeof()单纯计算数组的大小有“\0”。
例如:arr[]={1,2,3,4},sizeof(arr)=4*4=16。
sizeof为一个操作符,是计算内存大小-->占几个字节 ,其中int 4个字节, char 1个字节。
4、比较两个字符串是否相等用函数 strcmp(a,b)。a,b为两个比较的字符串。若返回0则相等。
5、rand()为生成随机数的函数,如果只写一个rand函数的话你每次运行程序你rand函数生成的随机数都是一样的,所以再rand之前还得加一个srand()函数,用来生成随机数的起点由其()里面的数字决定,所以要想每一次运行程序随机数都不一样,则在里面加入一个时间戳,即为每时每刻内部数字发生变动。
头文件为#include<stdlib.h>
#include<time.h>
srand((unsigned int)time(NULL); //NULL就可以理解为0
其中rand()%(n-m+1)+m算是一个公式,记录一下方便以后查阅。
比如产生10~30的随机整数:
srand(time(0));
int a = rand() % (21)+10;
6、system函数:头文件为“stdlib.h”在windows系统中,system函数直接在控制台调用一个command命令。在Linux/Unix系统中,system函数会调用fork函数产生子进程,由子进程来执行command命令,命令执行完后随即返回原调用的进程。
7、Stack overflow(这个报错表明栈溢出)。栈区:储存局部变量、函数的形参。 每一次函数的调用都会再栈区申请空间
堆区:动态内存分配,malloc、free、calloc、realloc
静态区:静态变量、全局变量。
8、字符串传给函数的不是字符而是传给它自己的地址!char* a; a[]="abc"。 *a的地址并不是整个a[],而是它第一个地址的值----是a,*(a+1)才是b,以此类推。
二、数组
1、随着数组下标的增长,元素的地址,也是有规律的递增。所以结论:数组再内存中是连续存放的(一维数组)。
2、二维数组的列数不可以省略,行可以。a[][x];
3、//数组传参的时候,形参有两种写法:
//1、数组。2、指针
数组形式:void aa(int arr[]) 数组名本质上是:数组首元素的地址。
注意!!!--》地址是应该使用指针来接收。所以arr这里看似是数组,本质是指针变量!!
4、数组名确实能表示首元素的地址。但是有两个例外
1、sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
2、&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
5、二维数组的数组名也表示首元素的地址(第一行的地址)。
三、操作符
1、若要得到小数的除法,不用整型,用浮点型:1.0/2
2、%操作符的两个操作项只能是整数。
3、<<、>>移位操作符的操作数只能是整数。**注意!!左移乘2,右移除2(为负数的话有余数加1,若为正数则直接相当于"\"号码)
4、整数在内存中存的是补码。正数 原、补、反都相同。负数反码除符号位反码取反,补码为反码加一。
5、 "^"异或操作符,异或支持交换律。交换a=3,b=5;a=a^b; b = a^b; a =a^b;
6、b=++a //是先++再使用,意思是把a= a+1,b=1,所以这时a是4,b也是4.
b=a++ //是把a的值给b,意思是把a= a,b=a+1,然后b再加1,a=3,b=4;
7、&&操作符左边为假,右边就不计算了
|| 操作符左边为真,右边就不计算了
四、指针
1、一个内存单元的大小为1byte(一个字节)。
2、32位机器的地址:32bit位-4byte,所以指针变量的大小为4个字节
3、64位机器的地址:64bit位-8byte,所以指针变量的大小为8个字节
4、令 int a= 1; int b =2; 当一个函数需要用到 a,b进行计算时:若输出的结果要改变原有的a和b的值时,则输入变量为取地址输入。
(传址调用, 把外部变量的地址传送到函数参数中,函数内部可以直接操作函数外部变量)
若输出的结果不需要改变原有的a和b的值时,只需正常传入a和b即可。
(传值调用,对形参的修改不影响实参)
5、把内存单元的编号就称为地址(地址也叫指针)
6、指针类型的大小(sizeof)都是四个字节,但是指针类型在被解引用的时候访问几个字节
1、如果是int*的指针,解引用访问4个字节
2、如果是char*的指针,解引用访问1个字节。以此类 推
***意思就是,指针类型的大小指的是“门牌号”,不管你是什么类型,你的指针的门牌号的大小都一样4字节。只是门牌数字不一样。具体门内房间的大小是几个字节这就具体看指针类型了。
7、指针的类型决定了指针+-1操作的时候,跳过几个字节。决定了指针的步长。例如整型指针+1,表示向后偏移4个字节。
8、指针减指针的绝对值得到指针和指针之间元素的个数。 不是所有指针都能相减,指针指向同一块空间才能相减。
五、结构体
1、结构体传参的时候,要传结构体地址。
2、struct student
{
int num;
char name[32];
float score;
}stu;
struct是结构体类型的关键字。struct student是用户定义的结构体类型。num,score都是结构体成员名,stu是结构体变量名。
六、杂乱知识总结
1、定义一个函数:void 表示没有返回值。int 则需要一个return 返回值。
2、数组不能自己获得一个初始值,所以每次写入一个数组时总需要先初始化数组,例如可以全部初始化为1。
4、字符串的末尾隐藏一个\0----char a[]="addad";如果是a[]={'a','b','c','c',}则没有\0。
------“\0”是字符串结束标志,是一个转义字符。在计算数组长度时'\0'是结束标志,不算做字符串的内容。------
5、static修饰局部变量的时候,局部变量出了作用域,不销毁。 本质上,static修饰局部变量的时候,改变了变量的 存储位置。
例:static i=1;i++; 下一次进入函数,i不在是从1开始,而是从i++的2开始。
6、static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内存链接属性。其他源文件(.c)就不能再使用到这个全局变量了。
7、输出的对其方式:\t直接对其;%2d右对齐2位;%-2d左对齐2位。
8、数字转换成字符只需要在后面加一个'0'即可。例:1+'0'='1';
七、懒得打字附上几张图片总结
1.break&&continue
2.switxh-break
3.辗转相除法求最大公约数
4.整数字节
5.如何选择整数类型
6.如何选择浮点类型
7.常用字符(逃逸字符)
8.数组的大小(多少个)
9.打印数据类型
10.关键字
11、位操作符
12.冒泡排序
13、二级指针