数组
陷阱一:数组的大小必须在编译期就作为一个常数确定下来。
很多初学者会这样写,以此来申请一个变长的二维数组,但这种写法在很多编译器中是不支持的,目前C99标准允许变长数组(VLA)。GCC编译器中实现了变长数组。有兴趣可自行查阅一下二者的不同。
int n;
scanf("%d", &n);
int a[n];
陷阱二:对于维数的理解。
例:int a[3][4]; 这个语句声明了a是一个二维数组,该数组拥有3个数组类型的元素,其中每个元素都是一个拥有4个整型元素的数组,不是一个拥有4个整型类型的元素的数组,其中每个元素又是一个拥有3个整型元素的数组。
指针
陷阱一:*(p + 1)
如果一个指针指向的是数组中的一个元素,那么只要给这个指针+ 1, 就能得到指向该数组中下一个元素的指针。但这对于非指向数组元素的指针是不成立的。如果两个指针指向的是同一个数组中的元素,下面这样做是有意义的:
int *q = p + i;
i = q - p;
表示我们可以通过q - p得到i的值。
陷阱二:数组指针
int a[3][4];
int (*p)[4]; //声明了*p是一个拥有4个整型元素的数组
p = a;
p将指向数组a的第1个元素也就是a[0],将数组a中的元素全部赋0,我们就可以这样写:
for(p = a; p < &a[3]; p++)
{
int *q;
for(q = *p; q < &(*p)[31]; q++)
{
*q = 0;
}
}