[Pointer]C中指针与多维数组学习

    问题描述:C中指针的用法非常灵活,合理使用指针可以避免副本拷贝等。多维数组与指针的结合使用有时可以带来许多方便。
    指针处理多维数组的行:这个处理相对简单,以二维数组为例,
int a[ROW][COL]={};
int *p;
    要用p指向a的某一行,使用p=a[i]即可。
    指针处理多维数组的列:比行处理稍复杂,因为数组是按行存储而非列。以二维数组为例,
#include <stdio.h>

int main(void) {
    int a[3][4]={0};
    int i,j;
    int (*p)[4];
    for(p=a;p<=&a[2];p++)
        (*p)[2]=8;
    for(i=0;i<3;i++)
        for(j=0;j<4;j++)
            printf("%d, ",a[i][j]);
    return 0;
}
    运行结果:
0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 
    这里用到了数组指针,int(*p)[4];为一个指向长度为4的一维数组的指针,二维数组a[3][4]的每一行都是长度为4的一维数组,因此可以将数组指针指向每一行的地址,然后用(*p)[2]=8;为指向的一维数组的第三个元素赋值8,这样即实现了对二维数组的列的操作了。
    多维数组名与指针:以二维数组为例,如a[ROW]{COL},数组名a此时是指向指针的指针,多维数组的理解可以参照一维数组,此时可将a看成是一个一维数组,但是每个元素也是一个一维数组,因此a就是指向其第一个一维数组元素的指针,即(*)[COL],此时(*a)[0]就是a[0]了:
#include<stdio.h>

int main(void)
{
    inti,j;
    inta[3][4]={0};
    int(*p)[4];

    //二维数组初始化
   for(p=a;p<=a+2;p++)
      for(i=0;i<4;i++)
          (*p)[i]=i;

    //二维数组打印
   for(p=a;p<=a+2;p++)
      for(i=0;i<4;i++)
          printf("%d, ",(*p)[i]);

    //打印**a
   printf("\n **a %d\n",**a);

    //利用数组名作为指针打印数组元素
   for(i=0;i<3;i++)
      for(j=0;j<4;j++)
          printf("%d, ",*(*(a+i)+j));
}
   运行结果:
0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,
 **a 0 
0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,

你可能感兴趣的:(c,多维数组,指针)