C指针和数组

    C语言中,数组需要注意的地方有两点:

    1、C语言中只有一维数组,数组大小必须在编译期就作为一个常数确定下来,数组中元素可以是任何类型对象,当然也可以是另外一个数组,这样,要“仿真”出一个多维数组就不是一件难事了;

    2、对于一个数组,我们只能做两件事:确定数组大小,及获得该数组下标为0元素的指针,其他关于数组操作,哪怕看上去是以数组下表进行运算的,实际上都是通过指针进行的;

    我们需要将数组运算与其对应指针运算融汇贯通,思考相关问题时,对这两种运算能自动切换。

   (1) 声明一个数组:

int a[3];

     这句话声明了a是一个有3个整形元素的数组。类似的有:

struct{
    int p[4];
    double x;
}b[17];

    这句话声明了一个拥有17个元素,其中每个元素都是一个结构,该结构中由一个拥有4个整形元素的数组(命名为p)和一个双精度类型的变量(命名为x),通过这个例子,可以很直观的理解第一点,数组中元素可以是任意类型,但是数组大小在编译器就作为一个常数确定下来。

    再看下面一个例子:

int calendar[12][31];

    这个语句声明了calendar为一个数组,该数组拥有12个数组类型元素,其中每个元素都是一个拥有31个整形元素的数组。因此,sizeof(calendar)为31x12=372。

    (2)声明一个指针

int *ip;

    任何指针都是指向整形变量的指针,这里,ip就是一个指向整形变量的指针,如果再声明一个整形变量i,并将i的地址赋值给ip,有:

int i;
ip = & i;

    这样,ip就指向变量i地址,我们就可以通过间接访问的方式,改变变量i的值

*ip = 17;

    如果指针指向的是数组中一个元素,我们就可以通过对指针加1或减1,就可以访问当前元素的后一个元素或前一个元素,这样,如果两个指针指向同一个数组,指针之间的减法就是有意义的,反之,没有意义。

    (3)数组与指针之间对应关系

    如果指针指向数组的第一个元素,可以写成:

p = a;

    这样,就可以将数组中下表为0的元素对应地址赋值给指针p,那么,p+1就指向a[1],p+2就指向a[2],.....,因此,下面两种写法是等价的:

*(a+i) <==> a[i]

    由于a+i和i+a并没有任何区别,因此,a[i]与i[a]也具有相同含义,但是我们不推荐后一种写法。

    再看一下“二维数组”,实际上他只是数组元素为数组的数组。

int calendar[12][31];
int *p;
int i;

    那么,我们将calendar的第五个数组取出来赋值给p有:

p = calendar[4];

    这句话的意思就是,将calendar第五个数组元素下标为0的元素地址赋值给指针p,获取其中元素有:

i = calendar[4][7];
// i = *(calendar[4] + 7);
// i = *(*(calendar+4)+7) ;

    下面两种表达方式与第一种完全等价,这就是数组与指针的等价表示。

     enjoy!!!

参考文献:

C Traps and Pitfalls

猜你喜欢

转载自blog.csdn.net/sinat_31425585/article/details/82347655