《C陷阱与缺陷》 第三章 语义“陷阱”

本文深入探讨了C语言中的数组与指针概念,包括一维数组的特点、字符串内存分配注意事项、数组作为函数参数的使用技巧、避免指针使用的误区、空指针与空字符串的区别、边界计算的重要性、条件判断的求值顺序、逻辑运算符的应用、整数运算的溢出风险及main函数返回值的设置建议。
摘要由CSDN通过智能技术生成

3.1 数组与指针

两点概念:1.C语言只有一维数组,且数组大小在编译器已经定下。2.对于一个数组,我们只能干两件事:确定数组大小和得到数组下标为0 的元素的指针。
数组下标原理: Array[ n ]    等同于  *(Array+n)
对于二维数组,可以理解为是以数组为元素的数组。

3.2 非数组的指针

C语言中字符串常量包含了字符串中所有字符以及一个‘\0’,在为字符串动态分配内存时应该考虑最后一个'\0'。

3.3 作为参数的数组申明 

int strlen(char* str)
{
}

int strlen(char str[])
{
}

的效果是完全一样的,str会被看作是指针,sizeof(str) = 4。

3.4 避免“举隅法”

这节说的是,要清楚指针指向内存的情况,不要将一个指针当作一个变量去理解(虽然有时候用起来感觉差不多,但心里始终要有个数)。有时候两个指针指向同一个内存,操作一个指针,相当于改变了指向共有内存的状态,这时候心里要有数。

3.5 空指针并非空字符串

不要将指向NULL的指针当空串用(虽然感觉一样,但其实不一样),不信可以在VS2005上试一下如下代码:
#include   <stdio.h>     
int   main(int argc, char *argv[])   
{   
	char   buffer[10];   
	char *p = NULL;
	printf( "%s\n",   p);
	buffer[0] = '\0';
	char *q = buffer;
	printf( "%s\n",   q);

	return   0;   
}

3.6 边界计算与不对称边界

这节很长,前半段我看懂了,说了这样一个边界问题: 10米路,每米有根电线杆,共多少根?
这其实是两个闭区间:[0,10],是11个,而一般大条的人觉得直接是10个,也就错了。一般来说,以程序员的经验,写for循环做做遍历的话应该是左闭右开的区间比较好,比如以上的应该是for(i = 0;i<=10;++i); 写代码时候一般用for(i = 0;i<11;i++);比较多,这样比较清晰而且平常。关键是个边界的习惯。

3.7 求值顺序

说了这样一个情况:
if(0 == i && ++a == 1 )
{
}
以上一个表达式,当 i ! = 1时,判断铁定为false,所以,代码是不会执行++a 这个操作的(对 || 也同理,如果前一个判断为true,后一个判断也不会执行)。如果不知道的话,可能会以为++a铁定执行,那就错了。

3.8 运算符 && ,||  和 !

这一节说的是不要将&& 和& 什么混用什么的。。。还有&& ,|| ,! 的结果不是1就是0。

3.9 整数溢出

这里说的是有符号运算要当心溢出。这是个基本功的问题。

3.10 为函数main提供返回值

说的是最好给main 加上 int 的返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值