现在的位置: 首页 > 综合 > 正文

二维数组和指向数组的指针

2013年06月28日 ⁄ 综合 ⁄ 共 1722字 ⁄ 字号 评论关闭

 

            关于数组名取地址的问题。c89、c99允许对数组名取地址,是由于数组符合一个对象的定义,按照一

        个对象的语义,对其取地址是合理的。但矛盾在于,数组名是一个符号地址,是一个右值,对其取地址不

        符合&运算符的语法。c89、c99委员会经过权衡,认为维护一个对象的合理性比一个运算符更重要、更合

        理,因此允许对数组名取地址。但是,&a的意义,已经不是对一个数组名取地址,而是对一个数组对象取

        地址,因此,&a所代表的地址值才跟a地址值一样,同时sizeof(&a)应该等于sizeof(a)

----------------------------------------------------------------------------------------------------------------------------------------------------------
     一个数组的数组名指向该数组的元素,是指向其第一个元素,也就是说是第一个元素的地址,本质是指向元素的,不是指向数组的,所以
     int b[4];
 要定义一个指针指向这个数组,指针的类型必须是和数组中元素的数据类型相同。
所以可以定义:
                   int *p;
          并且   p = b;
        可以 printf("%d\n",p[1]);
        或者 可以是*(p+2);
因为数组也是一种数据类型,所以也有指针指向数组这种数据类型,就是指向数组的指针。必须是指向数组这种类型而不是指向数组中的元素,将数组看成变量,如果要取
变量的地址,在其前面加&取地址符号,同样对数组也适用,在此情况下将数组看成一个大的整体,而不要去看其中的元素。
可以定义指向数组的指针:
                                int (*pArray)[4];
                              这种形式只是说明pArray是一个指针,并且是指向一个含有四个元素的指针,[4]就是表示其指向的数组中含有四个元素,再没有其他的含意,因为数组总要指示其大小。因为是指向数组的,所以如果将数组看成一个变量的话,
                             可以如给指针赋值:pArray = &b; // 虽然b是个一维数组,但仍然可以用指针指向它。
      对于二维数组,由于C语言中只有一维数组,将其看成是数组嵌套,看成一个一维数组,其中的元素是数组,因此二维数组名指向的是其中的第一个元素,也就是第一个一维数组,

        int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23}; //
a数组含有三个元素,每个元素都是含有四个元素的一维数组,数组名是指向数组中的元素的,并且是指向第一个元素的,也就是说是指向第一个一维数组的地址常量,故可以 赋值给指针变量。a是a的第一个元素的地址,也就是第一个一维数组的地址,是数组的地址,可以直接赋值给pArray,而a[0]=*(a+0)是a中第一个元素的值,相当于第一个一维数组的数组名,是指向数组中的第一个元素的,所以可以
                             int *p;
                                           p = a[0]; //p 是指向元素的
如果是指向数组的,则可以:
            int (*pArray)[4];

                                  所以可以有:pArray = a;
                                     也可以有 :pArray =a+1;

                                          也可以是 pArray = &a[0]; // 就是取第一个数组的地址,给指向数组的指针

 虽然有时值相等,都是起始地址,但是他们所指的数据对象不同,故不可以相互赋值!!!!!!!!!!!!

抱歉!评论已关闭.