C陷阱与缺陷读书笔记(二)

第三章

3.1 指针与数组

理解:

int calendar[12][31];
/*
C语言中只有一维数组,calendar是一个一维数组,
该数组含有12个数组类型的元素,其中每个元素都
是一个含有31个整型元素的数组
*/
int (*monthp)[31];
/*
*monthp 是一个拥有31个整型元素的数组,mouthp是一个
指向这样的数组的指针
*/

monthp = calendar;
/*
monthp 将指向数组calendar的第一个含有元素(含有31
个整型元素的数组)
*/
for(monthp = calendar; monthp <&calendar[12]; monthp++)
{
    int *dayp;
    for(dayp = *monthp;dayp < &(*monthp)[31];dayp++)
        *dayp = 0;
}

int month;
for(month = 0; month<12; month++)
{
    int day;
    for(day = 0; day < 31; day++)
        *(*(calendar + month) + day) = 0;
}

 

3.2 非数组的指针

//将字符串s与t拼接起来
char *r;
r = malloc(strlen(s) + strlen(t) +1);
//给r分配足够的空间容纳s,t,不要忘了最后的    '\0'
if(!r)//必须考虑无法分配空间的情况,进行处理
{
    complain();
    exit(1);
}

strcpy(r,s);
strcat(r,t);

/*过一段时间后再使用*/
free(r);    //不要忘记释放动态申请的空间

 

3.3 作为参数的数组说明

考察char amessage[] 与 char *pmessage的区别:

 

3.5 空指针并非空字符串

#define NULL 0

注意:当常数0被转换为指针使用时,不可以解除引用

eg:

if(p == (char*)0) ...          //合法
if(strcmp(p,(char*)0) == 0)... //不合法

因为strcmp会访问指针指向的内容。

 

3.6 边界计算与不对称边界

“入界点”:包括在取值范围内;

“出界点”:不包括在取值范围内。

int a[10],i;
for(i=0;i<10;i++)
a[i] = 0;
/*
数组的上界(第一个出界点)是数组元素的个数;
0是数组下标的第一个入界点(0在数组下标范围内,包括边界点)
10是数组下标的第一个出界点(10不在数组下标范围内,不包括边界点)
*/

3.6后续先空过,日后再补充

 补充:(1).逗号表达式:https://blog.csdn.net/DW_css/article/details/58709447

(2).对于数组结尾之后的下一个元素,取其地址是合法的,但读它的值是未定义的。

 

3.9 整数溢出

假设a,b是两个非负整形变量,则采用下面两种方法可检测是否溢出

if((unsigned)a + (unsigned)b > INT_MAX)   //强制转换为无符号整数
    cpmplain();

if(a > INT_MAX - b)
    complain();

 

posted @ 2018-07-31 14:25  花花与小叮当  阅读(195)  评论(0编辑  收藏  举报