C语言指针基础(3)

经过前面两篇的学习,相信大家对一级指针有了更深的理解。但是,这还是不够的。今天,我将讨论一下* 与 []这两个操作符的关系以及指针移动的基础。因为前面我是有时用*p,有时用p[0],可能有人不明白。

比如对于int a[ ] = {1,2,3,4};int *p = a;在这里,a的值是 1 的地址,p也指向了 1 的地址。也就是说两个p与a的值是相同的。接下来,我分别用a与p来遍历。

#include <stdio.h>

void main()
{
    int a[] = {1,2,3,4};
    int i,len;
    int *p = a;

    len = sizeof(a)/sizeof(*a);
    //1.
    printf("a[i]形式遍历:");

    for(i=0;i < len;i++)
    {
        printf("%4d",a[i]);
    }

    printf("\n");

    /*
    //2.
    printf("*a形式遍历:");
    for(i=0;i < len;i++)
    {
        printf("%d\t",*a++);
    }
    */
    printf("\n");

    //3.
    printf("p[i]形式遍历:");
    for(i=0;i<len;i++)
    {
        printf("%4d",p[i]);
    }
    printf("\n");
    //4.
    printf("*p形式遍历:");
    for(i=0;i<len;i++)
    {
        printf("%4d",*p++);
    }
}

输出的结果:
a[i]形式遍历: 1 2 3 4

p[i]形式遍历: 1 2 3 4
*p形式遍历: 1 2 3 4

可以看到,不管是a[i]还是*p还是p[i],输出的结果都是一样的。

事实上,p[i]其实也就是*(p+i),只是p[i]的写法更加适合我们的书写,在编译时,编译器帮我们进行他们的转换。但对程序员来说,两者并没有区别。

另外,值得我们注意的是,对于上面的int*p,他并不是数组,但也能用[]这个操作符。很多人可能都是从谭浩强的那本C语言书开始学习C语言的,或许学的不深,学完后可能以为只有数组才能用[],事实上绝不是这样的,只要你能用*(p+i)来获取数据,你也就一定能用p[i]来获得同样的数据。

可能还有人会问,为什么没有*a的形式,也就是通过*a++的形式来遍历。这里主要是因为数组名比较特殊,是一个常量指针,也就是说,a的指向不能改变,上述中的a++相当于a的指向+1,这是不行的。

另外,指针的移动也是需要我们灵活应用的。在字符串的练习中,大家对于这点应该是深有体会。

比如对于char str[] = “asd”;char *p = str;同样的,此时p指向了字符’a’的位置。然后p++,p此时指向’s’的位置。再p++,p此时指向’d’的位置。在p++,p此时指向’\0’的位置。再比如char *q = str,此时,我想获取字符’s’,可以怎么办呢?1.str[1] 2.*(str + 1) 3.q[1] 4.*(q + 1) 大家可以想一想,怎么通过此时的p获取’s’呢。注意条件式此时的p已经指向了最后一个字符’\0’的位置。

以上就是今天的C语言指针基础,主要是讲述*与[]的关系以及指针的移动,大家只要在脑中想象出指针指向的画面,应该就能很好的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值