https://zh.cppreference.com/w/%E9%A6%96%E9%A1%B5
C语言学习网
const int
~ 取反符号 如 a=~b (按二进制位取反)
三目运算符 a=(b<c?b:c)
局部变量都属于自动变量 所以在定义时 如
int 应为 auto int 但auto省略
enum 枚举
register寄存器
register int 把变量定义成寄存器变量
typedef 类型定义 使用:
typedef unsigned int u-int
此时 unsigned int和 u-int 等效
define宏定义
预处理指令: #define func(x) x*x
int b , A=10;
b=func(A);
func()直接替换为后面的表达式 需要注意运算顺序 如
b=100/func(A) 此时b的值为100
指针所占的内存由系统决定。32位为4个字节,64位为8个字节。
Else 和距离它最近的未成对的if匹配 故输出结果为空
即只判断一个if(a==1)
Switch语句中 default和case 的顺序可以改变
二分查找
Goto简单用法
Memset
记录函数调用次数,注意:++的优先级要高于*
Printf的返回值为其打印的数字个数
Stack Overflow - Where Developers Learn, Share, & Build Careers 程序员的知乎网站
简单地递归
Strlen和sizeof 对同一个字符数组时,sizeof比strlen大1.
不使用第三个变量:交换a和b的值
1.a=a+b,b=a-b,a=a-b; 但是有一定的局限性,可能会存在数值溢出的情况。
2.a=a^b,b=a^b,a=a^b; ^是异或运算。但是执行效率较低。
3.异或的规律:0^a=a, a^a=0, a^b^b=a(利用此规律寻找单个数字),
移位操作符:>>n左移n位(二进制) 右边补0
<<n右移n位(二进制) 左边补符号位
>>>无符号运算符 左边补0
&按位与 |按位或
统计num的补码中的数字1的个数
将num的补码通过不断地右移位并且与1的方法计算
Sizeof中的表达式不参与运算,因此s的值依然为0.
输出结果为 1 2 3 4
分析:a为0,a为0时,后面的逻辑与之后的式子不在计算。
下面的结果为2 2 3 4
a已经为真,后面的逻辑或也不再运算
逗号表达式:结果为最后一个式子的值
指针:允许指向数组元素的指针t与指问数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
关于数组arr:arr是数组首元素的地址 &arr[0]也是数组首元素的地址 &arr是整个数组的地址。
二级指针:
指针数组:数组中的元素都是指针
输出结果为11223300
输出结果为 >
I为-1,sizeof的返回值类型为无符号型,因此需要把-1转变为无符号型,即-1的补码比sizeof大得多。
计算一个整数的二进制数字中的1的个数:
结果为(11111111111111111111111110000000)10
结果为255,数字为-1~-128,127~0 0为字符0,即结束标志
指针数组:
用数组指针打印二维数组:
函数指针:
函数指针数组:
使用函数指针数组,减少代码的量
Strlen的返回值为无符号的int型,strlen(a)-strlen(b)>=0
交换两个字符串
Strcat函数:
将后一个字符串加到前一个字符串的末尾,前一个字符串的空间必须足够。
Strstr函数:
Strstr(p1,p2)在p1中寻找p2,返回p1中p2的位置,否则返回空指针。
Strtok函数:切割字符串
Memcpy,可以拷贝数组,字符串等。
Memmove:处理有重叠的拷贝的情况
Memset函数:初始化数组或字符串
Memset(arr,初始化的内容,要初始化的大小)
位(二进制位)段:冒号(:)后面的数字所占的字节数。Int型每次开辟4个字节(32位),同时可以把abc放入。不足时再次开辟四个字节将d放入
Char类型每次只开辟一个字节
Calloc函数同时可以初始化数组为0.malloc效率较高
Free时需要指针指向开辟内存的首地址,下面的示例是错误示例。
Free后,指针不会被置为NULL。
柔性数组:使用malloc调整数组大小。