整型提升:表达式中字符(char)和短整型(short)操作数在使用之前需被转换为普通整形(int)。
算术转换:某个操作符的操作数属于不同类型,需转换为同一类型。
{1 long double
2 double
3 float
4 unsigned long int
5 long int
6 unsigned int
7 int } 下层的需转换为上层的。
指针类型决定了解引用时访问几个字节,也决定了指针加减操作时移动几个字节。
二分查找防溢出:left+((right-left)>>1)
Void*:泛型指针,无具体类型,不可进行解引用和整数加减操作。
在C语言中,const修饰的变量是常变量,不可修改,但可以通过指针解引用来更 改。(封门打破窗)
在C++中,const修饰的变量变为常量。
const修饰指针变量时,放在*右边,限制的是指针变量本身,指针变量不能再指向其他变量,但可以通过指针变量,修改指针变量指向的内容。
const修饰指针变量时,放在*左边,限制的是指针指向的内容,不能通过指针来修改,但是可以修改指针变量本身(实质是修改其指向)。
指针-指针的绝对值是两指针之间的元素个数。
指针-指针必须保证两指针指向同一空间。
野指针:指向位置是随机的。
局部变量未初始化是随机值,全局变量未初始化默认为0
尽量不返回局部变量的地址,避免野指针。
assert(表达式):断言,表达式为真,继续运行,表达式为假,报错并终止运行,z知名在哪个文件,哪一行。使用时包含头文件<assert.h>。
如果不需要做断言,只需在头文件前加#define NDEBUG,编译器就会屏蔽到所有assert。
arr[i]<==>*(arr+i)<==>*(i+arr)<==>i[arr]
数组传参时,形参部分可以写成数组形式,但本质上还是指针变量。数组传参本质是传递数组首元素地址,形参和实参数组是同一个数组.形参不会再开辟数组空间,所以形参数组可以不写数组大小。
Char* p=”abcdef” p存放的是常量字符串首元素的地址。但常量字符串不可被修改,因为它被存放在代码段里,代码段里的数据不可被修改。相当于const int* p。
打印字符串:printf(“%s”,p); p是字符串的首元素地址。
strcmp(str1,str2):若str1>str2(abd与abc abcd与abc),返回整数,str1==str2,返回0,str1<str2,返回负数。
strstr(str1,str2):查找str1里是否存在str2,存在,返回str1中与str2相同字符串的首元素地址,不存在返回NULL。
Int (*p)[10]:数组指针,p是一个指针变量,指向一个是个整形元素的数组。[]的结合性大于*,所以要给*p加括号,保证它是一个指针变量。[]中的数字不可省略。
*(*(arr+i)+j)<==>arr[i][j]
函数名与&函数名都是函数地址,意义相同。
函数指针写法:int(返回值类型)(*pf)(int(参数类型),int(参数类型))
Typedef:类型重定义,给一类型重新取一个名字。例:typedef int xyz; 特殊的,对函数指针类型与数组指针类型重定义:typedef int(*pf_t)[5] 此时pf_t就是 int(*)[5]
把函数指针/数组指针中的变量名去掉,就是对应的类型。
函数指针数组格式:int( *p[10])(int, int),只需在函数指针的变量名后加上[]
qsort:库函数,用来排序数据,可以排序任意类型的数据,底层是快速排序。
结构体指针写法:struct stu *p 其中stu是自定义的结构体名,必须带着。
void qsort(void* base//指针,指向待排序数组的第一个元素
size_t num//base指向的待排序数组的元素个数
size_t size//base指向的待排序数组的元素大小
Int (*compar)(const void*, const void*)//函数指针,指向的就是两个元素的比较函数(需自己编写)
二维数组可以看成是一维数组,每个元素是一个一维数组。
arr[i][j]-->arr[i]可以看作是第i行的数组名。 而arr是整个二维数组的数组名。
字符串函数:1、strcpy(*p1,*p2)-->p2指向的字符串复制给p1.(\0也会一起复制) 此时p1不能指向常量字符串。2、strlen()--> size_t strlen(const char*) 所以strlen的参数必须是指针.,且返回值是无符号整数。3、 strcat:追加(连接)字符串 strcat(*p1,*p2)->把p2指向的内容连接在p1的后面。
字符分类函数:判断一个字符属于什么类型,若参数符合下列条件就返回真。
使用时包含头文件<ctype.h>
Iscntrl:任何控制字符 isspace:空白字符(换页\f 换行\n 回车\r 制表符\t 垂直制表符\v)
Isdigit;十进制数字’0’~’9’字符
Isxdigit:十六进制数字,包含所有十进制数字,小写字母a~f,大写A~F
Islover:小写字母a~z
Isupper:大写字母A~Z
Isalpha:所有字母
Isalnum:字母或数字
Ispunct:标点符号,任何不属于字母或数字的图形字符
Isgraph:任何图形字符
Isprint:任何可打印字符,包括图形字符和空白字符。
字符转换函数:int tolower( int c) 将大写转为小写 int toupper( int c) 将小写转为大写。
char* strtok(char* str,const char* sep)
Sep指向一个字符串,定义了分隔符的字符集合。Strtok以分隔符为界,从左向右依次取出字符串。例如ahsuvre@163.com 第一次取出ahsuvre,第二次取出163,第三次取出com(每一次取出都会标记一个分隔符的后一位) 第一个参数第一次传字符串首地址,后几次传NULL。
char* strerror(int errnum)
Strerror函数可以把参数部分的错误码对应的错误信息的字符串地址返回。
c标准库中规定了一些错误码,一般放在error.h 头文件中。c程序启动的时候会使用一个全局变量errno来记录当前错误码,只不过程序启动时errno为0,当程序发生某种错误时,就会将对应的错误码存放在errno中。
perror函数是strerror的加强版,直接打印错误信息,先打印传给perror的字符串,然后打印冒号,再打印空格,最后打印错误码对应的错误信息。 perror(某字符串)
各种0: 0-->数字0 ‘0’—>字符0,ASCII为48 NULL—>空指针,指向0地址, ‘\0’—>ASCII为0, “”--->空字符串。
char* StrStr(const char* A, const char* B) 在A字符串中查找B字符串,返回B在A中第一次出现的位置的地址,为出现则返回NULL。
Strn{cat、cpy、 cmp} 长度受限字符串函数,参数多一个size_t num(限制长度) strncat(arr1,arr2,num) 当arr1长度>arr2时,不够用’\0’补,当arr1<arr2时,不够不用补,正常追加到’\0’.
内存操作函数:(都是以字节为单位操作的)
1. void* memcpy(void* destination, const void* source, size_t num)
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置,拷贝结束后返回目标数据的首元素地址。 函数在遇到’\0’ 时不会停下来。 如果source和destination有任何的重叠,结果都是未定义的。 使用时包含头文件<string.h>
2 void* memmove(void* destination, const void* source, size_t num)
Memmove函数可以处理内存重叠的情况,其他和memcpy一致。
3 void* memset(void* ptr,int value, size_t num)
把ptr指向空间中num个字节的数据全部改为value, 注意:memset是以字节为单位设置的,不是以元素为单位的。 在对整形数据操作时需注意 (00 00 00 00)—>四字节
4 int memcmp(const void* p1, const void p2, size_t num)
比较从p1和p2指针指向的位置开始,比较num个字节的数据. 返回整数。
内存从左到右依次增大,低位存在高地址中为大端法,反之为小端法。
Char 是否有符号取决于编译器,vs上char是有符号的
给char类型复制一个数,最终也会根据ASCII转化为对应的字符
1E10==1.0*10^10
IEEE754:任意浮点数都可以表示为V=(-1)^S*M*2^E
(-1)^S表示符号位,S>0,为正,S<0,为负。 M为有效数字,大于等于1,小于等于2 E为指数位。
浮点数在计算机里存储的是S,M,E
对于32位浮点数(float),最高位的一位存S,接着8位存E,剩下的23位存M 对于64位浮点数(double)最高为一位存S,接着11位存E,剩下的52位存M
在计算机内部保存M时,默认第一位总是1,因此可以被舍去,以此节省一位有效数字。
对于E,计算机将其视为无符号整数,在存入E的真实值时必须加上一个中间数,8位的E加上127,11位的E加上1023。
浮点数取出时,分三种情况:
- E不全为0或1,E减去127或1023,得到真实值,M补回最高位的1.
- E全为0:此时E的真实值规定为1-127或1-1023,M不再补回首位的1,而是还原为0.xxxxxxxxx的小数,以此表示正负0或无限趋近于0的数字。
- E全为1:此时如果M全为0,就表示正负无穷。
- 匿名结构体类型:去掉结构体的标签,且此结构体类型只能用一次。
80、结构体自引用:在结构体中定义一个和自身结构体类型一样的变量(如链表的定义) 匿名结构体是不能完成结构体自引用的。