C语言小知识更新

内存


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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值