指针与数组
(1)
1、int a[3]; //声明a是一个具有3个整型元素的数组。
2、struct{
int p[4];
double x;
}b[17];
//声明了b是一个具有17个元素的数组,其中每个元素都是一个结构,
//该结构中包括了一个具有4个整型元素的数组(命名为p)和一个双精度类型的变量(命名为x)。
(2)
1、两个指针可以相减,但不可以相加。
2、给指针加1,就能够得到指向该数组中的下一个元素的指针。其他以此类推。写成p=p+i,而不是*p=*p+i。
例:p=p+1; 等价于p++;
*(a+i); 等价于 a[i]
3、数组与指针之间的赋值
前面声明了a是一个拥有3个整型元素的数组。后面声明p为一个指针。
数组名当作指向该数组下标为0的元素的指针。
因此可以这样写:
p=a;//把数组a中下标为0的元素的地址赋给p。
而不是写成
p=&a;//非法,因为&a是一个指向数组的指针,而p是一个指向整型变量的指针,类型不匹配。
(3) 二维数组的表示
1、int calendar[12][31];
int *p;
int i;
则calendar[4]表示calendar数组的第5个元素,是calendar数组中12个有着31个整型元素的数组之一。
sizeof(calendar[4])的结果是31与sizeof(int)的乘积。
p=calendar[4];//表示使指针p指向了数组calendar[4]中下标为0的元素。
i=calendar[4][7];//表示指定了这个数组的中的元素。
上述语句也可表示为i=*(calendar[4]+7);或者i=*(*(calendar+4)+7);
从上面可以发现用带括号的下标形式很明显地要比完全用指针来表达简便得多。
而这样却是非法的:
p=calendar;//因为calendar是一个二维数组,即“数组的数组”,这样则指向数组的指针。
而p则是指向整型变量的指针。
2、由(1)得显然需要声明一种指向数组的指针的方法 int (*ap)[31];
int calendar[12][31];
int (*monthp)[31];
monthp=calendar;
//这样,mothp将指向数组calendar的第一个元素,
//也就是数组calendar的12个有着31个元素的数组类型元素之一。
以使用指针monthp以步进的方式遍历数组calendar:
int (*monthp)[31];
for(monthp=calendar;mothp<&calendar[12];monthp++)
{
int *dayp;
for(day=*montp;datp<&(*monthp)[31];dayp++)
*dayp=0;
}
//含义为在新的一年开始时,清空calendar数组
也可以写成:
int moth;
for(month=0;month<12;month++)
{
int day;
for(day=0;day<31;day++)
calendar[month][day]=0;
}
笔记摘自《C陷阱和缺陷》