指针与数组

我们已经知道,每个变量都有它自己的地址,由于数组是多个同类型的变量,所以每个数组元素都有它自己的地址,且在一个数组内的所有元素地址是连续的。数组元素的指针就是数组元素的地址。当我们想引用数组元素,可以用下标引用,这是数组元素的直接引用。通过指针引用数组是数组元素的间接引用。

特别地,C语言中数组名代表数组首元素的地址。例如下面第3、4两行代码等价:

int  *p;
int  a[10];
p = a;
p = &a[0];

当指针指向数组元素的时候,对指针的运算概念与我们之前提到的四则运算有所不同。指针加一个整数n时,代表指针向前移动n个元素,减则为向后移动。同样也可以进行自加和自减运算。当两个指针都指向同一个数组中的元素时,两个指针相减则表示两个指针相隔的距离。例如:

#include<stdio.h>
int  main( )
{
    int  *p;
    int  a[10];
    int  i;
    p = a;    //这行可以等价为  p = &a[0] 或*p = a[0]

    for(i = 0 ; i < 10 ; i ++)
        a[i] = i;
    for(i = 0 ; i < 10 ; i ++ , p ++)
        printf(“%d” , *p);
    return  0;
}

特别地,当指针指向数组元素进行加减时,指针加一不是将p的值(地址)简单地加一,而是加上一个指针类型所占用内存大小的字节数。例如我们定义指针和数组如下:

char  a[] = “WELCOME”;
int  *p;
p = a;

注意到数组类型和指针类型不同,但我们将指针指向数组首元素。这个时候如果:

printf(“%c” , *p);
p ++;
printf(“%c” , *p);

第1行会输出字符数组的首字符 ’W’,但经过第2行指针移动后,第3行不会输出第二个字符而会输出第5个字符 ‘O’。这就是因为整形元素占用4个字节,而字符型元素占用1个字节。移动指针时按照指针类型移动了4个字节,相当于字符数组的4个元素的大小。

同时,指针还可以与之前学过的函数结合,例如数组首元素可以当成函数的参数,可以声明指针类型的数组,感兴趣的可以自己查阅参考文献1的教材。

这本书是xt写的上次修改: 2019-04-18 15:24:43

results matching ""

    No results matching ""