|
指针和数组的统一
#include #include
void main() { int i,j; int arr[2][3]={1,4,7,3,6,9}; //毫无疑问,这是个静态的二维数组,分配了空间,数据也存入了 int (*p)[3]; //这是用指针来定义二维数组,但是没有分配空间,因此p是个盲指针
//打印数组arr for(i=0;i<2;i++){ for(j=0;j<3;j++) printf(" %d ",arr[i][j]); printf("\n"); }
p=arr; //p指向arr数组的第一行,可以用p读取arr的元素了 for(j=0;j<3;j++) printf(" %d ",(*p)[j]); //现在用p访问arr的第一行 printf("\n"); //p=p+1; //现在p指向arr数组的第二行 for(j=0;j<3;j++) printf(" %d ",(*(p+1))[j]); //现在用p访问arr的第一行 printf("\n");
//下面这一段是上面的代码合在一起的写法 p=arr; for(i=0;i<2;i++,p++){ for(j=0;j<3;j++) printf(" %d ",(*p)[j]); printf("\n"); }
//上面是用p来读取数组arr的元素, p还没有自已的内存空间
//下面给p分配空间来实现4行3列的二位数组 p=(int(*)[3])calloc(4,sizeof(int[3])); //搞定
//这个数组其实就是int p[4][3]
//现在我们用所熟悉的p[i][j]方式来访问 for(i=0;i<4;i++){ for(j=0;j<3;j++) p[i][j]=(i+1)*(j+1); //ok?
} for(i=0;i<4;i++){ for(j=0;j<3;j++) printf(" %d ",p[i][j]);//ok? printf("\n"); }
/*结论就是
如果需要定义一个8行3列的数组 int arr[8][3]; 等同于 int (*arr)[3]; arr=(int(*)[3])calloc(8,sizeof(int[3]));
访问数组的第5行第3列的元素也有两种写法,这两种写法在以上两种方式定义的数组都可以 (1) arr[4][2] (2) (*(arr+4))[2]
这就是指针和数组的统一,不要再说指针难了,指针是用来实现动态数组的; 如果行数和列数可以预知,你就用传统的方法定义数组好了。
VB是不是也有动态数组?是的,只不过VB用redim语句就可以了。
*/
}
|