【内功篇】指针&数组&字符串(三)

前面简单的说了指针,和数组,它们之间又有啥关系呢?此篇就让我来探究一番。


指针与数组的关系:

指针和数组的关系十分紧密。我们知道定义一个数组aint a[10],数组名就是数组首元素的首地址,既然是地址,我们就可以定义个指针指向它int *p = a,我们看一段代码:

#include <stdio.h>

int main()
{
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    int *p = a;
    int i;

    for (i = 0; i < 10; i++)
    {
        printf ("%d\t",a[i]);
    }

    printf ("\n");

    for (i = 0; i < 10; i++)
    {
        printf ("%d\t",p[i]);
    }

    printf ("\n");

    return 0;
}

打印下结果:
这里写图片描述
输出的结果一样,是不是看出了它们间的关系;

但是,我们可千万不要把指针和数组混为一谈:虽然看起来差不多,其实差别可大了。

比如:

#include <stdio.h>

int main()
{
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    int *p = a;

    printf ("%d\n",sizeof(a));
    printf ("%d\n",sizeof(p));

    return 0;
}

打印下结果:
这里写图片描述

可以看出,它们的长度就不一样,其实sizeof(a)得到的是整个数组的长度,而sizeof(p)得到的是地址的长度。这里的p只是存了a的地址,它并不能代表a,编译器也只是先从p中取到a的地址然后通过下标取值。
看一幅图来了解下:
这里写图片描述

a是首元素首地址0x0011ffdd,它存的是一串数,而p的地址存在内存的某一个地方,它存的是a的地址。看出它们本质上的区别了么。

指针数组:

指针数组,顾名思义,它是一个数组,数组里存的是指针。
如:

#include <stdio.h>

int main()
{
    int a;
    int b;
    int c;
    int *p[3] = {&a, &b, &c};

    for (a = 0; a < 3; a++)
    {
        printf ("%p\t",p[a]);
    }

    printf("\n%p\n",p);

    return 0;
}

打印下结果:
这里写图片描述
再看下内存图:
这里写图片描述
由这幅图我们可以看出,数组名是p,数组的首元素的首地址(由于代码中输出的是p,所以这里不说是数组的首地址,&p的地址才是数组首地址,即使地址是一样的,但是概念不一样)是0x0060FEF8,数组里存的是a,b,c的地址,应该很容易就明白了吧。


数组指针:

数组指针,顾名思义,它是一个指针,指向一个数组。
如:

#include <stdio.h>

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

    for (i = 0; i < 3; i++)
    {
        printf ("%d\t",p[i]);
    }

    return 0;
}

打印下结果,算了,不打印了,因为打印不出来,为啥,因为编译就通过不了,问题在于第5行给数组指针进行初始化,它是一个指针,怎么能用数组的方法初始化呢,所以编译器是不通过的。如果我们想给它值,只能向下面这样了:

#include <stdio.h>

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

    for (i = 0; i < 3; i++)
    {
        printf ("%d\t",(*p)[i]);
    }

    return 0;
}

打印出来:
这里写图片描述
看下内存图:
这里写图片描述

从内存图中可以看出,有一个数组,数组里存了3个整型数据,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值