第三章
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,不要忘了最后的 ' '
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();