内存
1 用递归实现算法时,虽然程序简洁,但一旦递归深度过大,对堆栈内存空间的消耗变大,可考虑用数组或其他数据结构”缓存“,而满足循环不变式的缓存,就是动态规划
2 在大部分编译器下,long 和int的大小一样,都为4字节,long long 为8字节
3 两个变量相乘,乘积的最大值取决于这两个变量的最大内存,而不取决于结果变量。
4 一切声明了但没有分配内存空间的(包括指针和各种数据类型),其值都为NULL,或者说没有值,此外,给指针赋值为0表示为空(这样可以用memset对包含指针的结构体初始化),但是赋值为-1为11111111的地址)
5 通过malloc分配的空间,并不对该空间的数据进行处理,如果是int型的空间其值并不保证为0,char类型并不保证其值为NULL,所以如果需要做边界判断,最好先对分配的空间初始化。
而初始化最好的办法是memset(int *s, int ch, size_t n):将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。同理可用于字符内存空间和结构体。
需要注意:
memset按字节对内存初始化,所以不能将int空间初始化为0和-1之外的任何值,除非该值高字节与低字节相同
补充: 数组分配的空间也是,如果没有初始化,也不保证值为0或者为”
I/O
1 %*d在输出时星号表示输出长度占位符,如:
printf(“%*d”,4,a);
而在输入时表示忽略该类型字符
2为了实现不同长度的输出变量列对齐,可以用\t
3对于scanf函数,在数值输入时,两个变量之间可以相隔很多空格和换行符,但在字符输入时,两个变量之间需完全按照scanf给出的格式来,不要有多余的空格或者换行符(毕竟其本身也是一种字符)
4 printf中格式字符串“%*s”或者“%*d”表示自己输入固定长度,如printf(“%*s”,5,”a”);
数据对象
1判断数组或者指针链表的长度有两种方法:
- 对于字符型数组或列表,可以直接用strlen()函数求实际长度
- 对于非字符型数组或列表,例如对于整形数组a,可以用sizeof(a)/sizeof(a[0]),但是sizeof返回的只是所占内存的长度,不是实际长度
2 大写字母比小写字母ASCII码小32
3 float、double等浮点数不能用==去比较,因为其本身也是不精确的,一般对于两个浮点数a,b,相等的判断方法是**fabs(a,b)<1e-6
4 数组指针 int (*p)[10]
指针数组 int *p[10]