c语言指针与数组

c语言指针与数组

我们讨论一下c语言中的指针与数组的关系

通常我们定义一个数组的形式如下:

int A[5] = {2,4,6,8,10};

他的5个变量分别对应的值是

A[0] = 2,A[1] = 4,A[2] = 6,A[3] = 8,A[4] = 10

他们如果用图示表示出来则如下

数组元素A[0]A[1]A[2]A[3]A[4]
数组值246810
数组地址100104108112116

上面表格表示数组元素在内存中的分布和示意,数组是一块连续的内存,相邻元素间的地址是连续的的,一个整形元素的大小是4个字节,A[1]的地址比A[0]的地址大4,依次递增,整个数组所占的空间大小是4*5=20byte

我们接下来定义一个整形变量int x和一个指针int *p,

int b = 5;//定义变量b
int *p;
p = &b;

我们知道*p的值为5,p的值为b的地址,如果我们想要知道b的下一个地址中的值,我们可以通过指针找到他的地址p+1和地址中的值 *(p+1)。

对于数组来说我们同样可以这样来操作

int A[5] = {2,4,6,8,10};
int *p;
p = &A[0];//取数组A的首地址

这样我们就可以通过指针得到数组A的起始地址和首元素,p对应的就是A的首地址,*p对应的是A[0],数组的首个元素值为2,下面我们用代码来演示操作一下。

#include <stdio.h>

int main()
{
        int A[5] = {2,4,6,8,10};
        int *p;

        p = &A[0];
        printf("&A[0] = %d,A[0] = %d\n",&A[0],A[0]);
        printf("p = %d,*p = %d\n",p,*p);
        return 0;
}

打印出来的结果指针p指向的数组A的首地址

image-20210117215258840

如果我们想得到下一个元素同样可以操作指针得到

p = p+1;//指向数组的下一个元素地址
*p = *(p+1);//得到下一个元素的值

通过代码依次打印数组的地址和值

#include <stdio.h>

int main()
{
        int A[5] = {2,4,6,8,10};
        int *p;
        int i = 0;

        p = &A[0];

        for(i = 0;i<5;i++)
        {
                printf("&A[i] = %d,A[i] = %d\n",&A[i],A[i]);
                printf("p+%d = %d,*(p+%d) = %d\n",i,p+i,i,*(p+i));
        }
        return 0;
}

打印结果如下,可以看出通过指针操作和数组索引得到的值是一样的

image-20210117220152634

这里p=&A[0],也可以写成p = A;A代表的也是数组的首地址,我们打印一下看看

#include <stdio.h>

int main()
{
        int A[5] = {2,4,6,8,10};
        int *p;
        int i = 0;

        p = A;

        printf("&A[0] = %d,A = %d\n",&A[0],A);
        for(i = 0;i<5;i++)
        {
                printf("&A[i] = %d,A[i] = %d\n",&A[i],A[i]);
                printf("p+%d = %d,*(p+%d) = %d\n",i,p+i,i,*(p+i));
        }
        return 0;
}

打印出来&A[0]和A的值一样

image-20210117220823082

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值