1.指针与数组
c语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。
任何一个数组的下标运算都等同于一个对应的指针运算
a[n]=*(a+n)
数组名除了被用作运算符sizeof的参数这一情形,是表示数组大小以外,在其他所有情形中数组名都代表指向数组中下标元素为0的指针
二维数组
c[12][31]
常见错误
int *p=c;
c是一个二维数组,即数组的数组,在上下文使用c名称会将其转换为一个指向数组的指针,而p是指向整型的指针,这种赋值是非法的。
正确的是:
int (*mon)[31];//指向数组的指针
mon = c;
当使用数组名作为函数参数传递时,数组名会立刻转换为指向数组第一个元素的指针
空指针不等于空字符串,将0赋给一个指针变量时,绝对不能使用指针所指向的内存的内容。
2.malloc
malloc可能无法提供请求的内存,所以使用malloc函数时一定要检查它的返回值
对于分配的内存必须显式的释放(free),main函数结束后都不会自动释放malloc分配的内存
对于字符串s,如果strlen的返回值为N,那么整个字符串实际需要N+1的空间,因为还有个‘\0’
3.不对称边界
这个问题是针对以0作为数组元素的c语言提出的。
解决这个问题的编程技巧是存在的:用第一个入界点和第一个出界点来表示一个数值范围。
如边界条件16<=x<=17应该表示为16<=x<18
下面是这种编程技巧带来的程序简化效果:
1)取值范围的大小就是上下边界之差
2)如果取值范围为空,那么上界等于下界
3)即使取值范围为空,上界也永远不可能小于下界
在buffer的使用中也可以借鉴这个原理,让指针指向缓冲区第一个未占用的字符,而不是最后一个已经占用的字符,这样buffer为空可以使用bufptr==buffer来判断,bufptr-buffer就是buffer中元素的个数。
4.整数溢出
a,b:两个非负整型变量。
if(a+b<0)
.....
如果a+b发生溢出时,这种假设不在可靠。
一种正确的方式是把a,b转换为无符号整数
if((usi)a+(usi)b>INT_MAX)
.....
另外一种不使用无符号运算的方法是
if(a>INT_MAX-b)
.....
阅读(622) | 评论(0) | 转发(0) |