数组的相关知识
- array[m][n]=(*array)+i *n+j
如果m,n为负数情况下,同样适用 - array[i]=i[array]
- num+i与num[i]是一致的
- 数组在传送给函数时作为指针传递,所以此时的大小是指针的大小
sizeof的知识点
- sizeof( )不会执行括号中的表达式
static的知识点
- static在第一次定义的时候会进行赋值,第二次是则不会,保留之前的值
const的知识点
- const 修饰的不改变
char *const p1
const直接修饰p1,指针地址不能变
const char *p2
char const *p2
两者意思一致,const修饰的是*p2,指向的值不能改动
&a与a的区别
- &a代表的是数组的指针,&a+1代表整个数组加1
- a代表的是数组首元素的地址,a+1代表a[1]
define的定义
- 在进行define替换时,需注意添加括号,否则可能发生错误
- 在define替换时,进行的是直接替换
#define MULTIPLY(x,y) x*y
int x=MULTIPLY(1+2,3);
//此时x的值为7,因为1+2*3
- 当宏参数是另一个宏的时候,需要注意的是凡宏定义里有用’#’或’##’的地方宏参数是不会再展开.
即, 只有当前宏生效, 参数里的宏不会生效
加一层转换宏就可以生效
#define YEAR 2018
#define LEVELONE"XiyouLinux"#x"\n"
#define LEVELTWO(x) LEVELONE(x)
printf(LEVELONE(x));
printf(LEVELTWO(x));
//xiyoulinuxYEAR
xiyoulinux2018
结构体字节对齐
- 计算时按最大成员的大小进行逐个判断,有需要就补位
类的sizeof计算原则
1.类的大小为类的非静态成员数据的类型大小之和,也就是说静
态成员数据不作考虑。
2.普通成员函数和构造函数与sizeof无关。
3.虚函数由于要维护在虚函数表,所以要占据一个指针大小,也
就是4字节。
4.类的总大小也遵守字节对齐规则。
main函数
- argc指代参数的个数,argv指代每个参数
- 如果 main 函数的最后没有写 return 语句的话,则加入return 0,表示程序正常退出。
- return的返回值会进行类型转换,比如:若return 1.2 ;会将其强制转换为1,即真正的返回值是1
详细见main函数的返回值
printf的返回值
- printf的返回值从右到左进行读取
运算符(左移右移)
- 左移:高位(左边)丢弃,低位(右边)补0
左移n位,将它的值乘以2的n次方 - 右移:符号位不变,低位舍弃,高位补上符号位
右移n位,将它的值除以2的n次方
大小端
- 小端:将低序字节存储在起始地址
大端:将高序字节存储在起始地址
越界处理
- 当输入的值大于char的一边极限值时,会从另一边开始以剩余的差值计算。
详细见char越界处理
/ddd转义字符
- \ddd 最多只支持三位数字
使用 ‘\ddd’ 方法赋值实际上是将八进制数字通过转义字符 ‘’ 赋值为ascii表中对应的字符。
详细见转义字符