数组,指针数组,数组指针的学习理解

来源:互联网 发布:淘宝 退货流程 编辑:程序博客网 时间:2024/06/17 18:14

本文将以如下定义的数组及指针为例,对数组,指针数组,数组指针进行说明。这是看完书后总结的,所谓好记性,不然烂博客,想将这些总结记下,以便需要时进行重温。如有理解上的错误,望大家指出。

int a[3][3]={{0,1,2},{3,4,5},{6,7,8}};
int (*p0)[3];
int *p1[4];
int **p3;
int *p4;

1、二维数组

A、二维数组名 a 是一个二级地址(平面地址),其每次加1,对应的地址加“总列数 * 每一元素占的位数”,即指向下一行的首地址。具体理解看程序:

        printf("a:%d\n",a);
printf("*a:%d\n",*a);
printf("**a:%d\n",**a);
        printf("**(a+1):%d\n",**(a+1));
        printf("*(*a+1):%d\n",*(*a+1));
        printf("\n");

        


        B、a[i]、*a、&a[i][j] 是一级地址(线性地址),其每次加1,对应的地址移向下移元素:

        printf("a[0]:%d\n",a[0]);
        printf("*a[0]:%d\n",*a[0]);
  printf("*(a[0]+1):%d\n",*(a[0]+1));
        printf("\n");

printf("a[1]:%d\n",a[1]);
        printf("*a[1]:%d\n",*a[1]);
printf("*(a[1]+1):%d\n",*(a[1]+1));
        printf("\n");

        p4=&a[0][0];//p4=*a//p4=a[0]  //此3种方法对p4赋值,效果一样
printf("p4:%d\n",p4);
        printf("*p4:%d\n",*p4);
printf("*(p4+1):%d\n",*(p4+1));
        printf("\n");

        


2、指针数组

一维指针数组名p1是指针数组的首地址,是一个二级地址。可以将其赋给一个二级指针,如 “p3=p1;” 。p1[i]是一级地址。此外,p1=a[0]、p1=a 这些试图对p1进行赋值的语句都是错的,因为p1是数组名(就像int a[10]中的a一样),代表一个地址,而不是变量,所以不能进行赋值。这跟数组指针变量不一样,数组指针归根到底还是变量,所以可以进行赋值操作。

结合程序理解:

       for(int x=0;x<3;x++)
p1[x]=a[x];

        printf("指针数组\n");


printf("a:%d\n",a);
printf("a[1]:%d\n",a[1]);
printf("\n");

        printf("p1:%d\n",p1);
        printf("p1+1:%d\n",p1+1);//运行结果表明,p1+1等于&p1[1]
printf("&p1[1]:%d\n",&p1[1]);
printf("\n");

        printf("*(p1+1):%d\n",*(p1+1));
        printf("**(p1+1):%d\n",**(p1+1));
        printf("\n");

printf("p1[0]:%d\n",p1[0]);
printf("*p1[0]:%d\n",*p1[0]);
        printf("*(p1[0]+1):%d\n",*(p1[0]+1));
        printf("\n");


printf("p1[1]:%d\n",p1[1]);
printf("*p1[1]:%d\n",*p1[1]);
        printf("*(p1[1]+1):%d\n",*(p1[1]+1));
printf("\n");

        


3、数组指针

数组指针变量p0是一个二级指针,但不能将其赋给另一个定义的二级指针。如,“p3=p0;”是不合法的。具体理解结合程序:

        p0=a;

        printf("a:%d\n",a);
printf("a[1]:%d\n",a[1]);
printf("\n");

      
printf("p0:%d\n",p0);
printf("*p0:%d\n",*p0);
printf("**p0:%d\n",**p0);
printf("*(*p0+1):%d\n",*(*p0+1));
printf("**(p0+1):%d\n",**(p0+1));
printf("\n");

        


注意:二维数组中,数组名 a 代表数组的起始地址。a+1与a[1]都是地址,二者的值相同。但 a+1 表示第1行的起始地址,是一个二级地址,a[1]表示第1行0列元素的地址,是一个一级地址,二者意义不一样。

0 0