本帖最后由 lynn010 于 2016-1-1 14:17 编辑
int a[4][4];int *p[4]={a[0],a[1],a[2],a[3]} ;p指针数组
int (*q)[4]=a; 二维数组指针,是一个指针变量
二者皆可表现二维数组,如上。
一、赋值
指针数组赋值应为一组元素:int *p[4]={a[0],a[1],a[2],a[3]} ;
二维数组指针直接将二维数组名赋值即可:int (*q)[4]=a;
二、表示值
指针数组表示数组元素值的形式:a[j]=*(p+j)
二维数组指针表示数组元素值的形式:a[j]=*(*(q+i)+j) 类比二维数组另一种表达方式 *(*(a+i)+j) 其中a为数组名
三、等级
指针数组内的元素皆为一级指针
二维数组指针为一个二级指针
四、累加
指针数组累加 p=p[0]=a[0]=a;p+1=p[1]=a[1];指针数组p所存储的都是a[4][4]数组的行指针 二维数组指针q=a=a[0];q+1=a[1] 因为指针的长度为8,所以每加1即使增加8个字节,并不以数据类型为准
测试代码:
- int a[2][2]={1,2,3,4};
- int *p[2]={a[0],a[1]};
- int (*q)[2]=a;
- printf("print the array a:\n");
- for (int i=0; i<2; i++) {
- for (int j=0; j<2; j++) {
- printf("a[%d][%d]=%p\t",i,j,&a[i][j]);
- }
- printf("\n");
- }
- printf("*p[2]:\n");
- /**
- * 以下用指针数组输出
- */
- for (int i=0; i<2; i++) {
- for (int j=0; j<2; j++) {
- printf("a[%d][%d]=%d\t",i,j,*(p[i]+j));
-
- }
- printf("\n");
- }
- /**
- * 以下用二维数组指针
- */
- printf("*q输出数组a:\n");
- for (int i=0; i<4; i++,q++) {
-
- printf("a[%d]=%p\n",i,*q);
-
- }
- /**
- * 以下q指针不动,类似数组a方式输出
- */
- q=a;
- printf("*(q+i)+j输出数组a:\n");
- for (int i=0; i<2; i++) {
- for (int j=0; j<2; j++) {
- printf("a[%d][%d]=%p\t",i,j,(*(q+i)+j));
- }
- printf("\n");
- }
复制代码
测试结果如下:
http://blog.csdn.net/linmx000/article/details/50429261
|