理解一个经典的指针小程序

本文通过分析一个具体的指针小程序,揭示了指针与数组之间的操作原理。在GCC环境下,程序展示了指针变量c指向数组a后,如何通过c来修改数组元素的值。分析了c[0]、3[c]对数组元素的影响,以及指针在地址加一时,int类型指针和char类型指针的区别,强调了不同数据类型指针在地址偏移上的差异。
摘要由CSDN通过智能技术生成
分析关于指针的一个小程序
#include <stdio.h>
#include <stdlib.h>

void
f(void)
{
    int a[4];
    int *b = malloc(16);
    int *c;
    int i;

    printf("1: a = %p, b = %p, c = %p\n", a, b, c);

    c = a;
    for (i = 0; i < 4; i++)
    a[i] = 100 + i;
    c[0] = 200;
    printf("2: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",
       a[0], a[1], a[2], a[3]);

    c[1] = 300;
    *(c + 2) = 301;
    3[c] = 302;
    printf("3: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",
       a[0], a[1], a[2], a[3]);

    c = c + 1;
    *c = 400;
    printf("4: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",
       a[0], a[1], a[2], a[3]);

    c = (int *) ((char *) c + 1);
    *c = 500;
    printf("5: a[0] = %d, a[1] = %d, a[2] = %d, a[3] = %d\n",
       a[0], a[1], a[2], a[3]);

    b = (int *) a + 1;
    c = (int *) ((char *) a + 1);
    printf("6: a = %p, b = %p, c = %p\n", a, b, c);
}

int
main(int ac, char **av)
{
    f();
    return 0;
}

在gcc下的输出结果:

1: a = 0x7ffcef6e3ff0, b = 0x235e010, c = 0x40074d
2: a[0] = 200, a[1] = 101, a[2] = 102, a[3] = 103
3: a[0] = 200, a[1] = 300, a[2] = 301, a[3] = 302
4: a[0] = 200, a[1] = 400, a[2] = 301, a[3] = 302
5: a[0] = 200, a[1] = 128144, a[2] = 256, a[3] = 302
6: a = 0x7ffcef6e3ff0, b = 0x7ffcef6e3ff4, c = 0x7ffcef6e3ff1

问题主要处在第五次打印和第六次打印上。

  1. 打印变量的地址
  2. 把地址常量 a 赋值给指针变量 c,即 c 指向数组 a 的首地址。然后用 for 循环给数组初始化,即 a[0]=100 a[1]=101 a[2]=102 a[3]=103 ,然后 c[0]=200 =>a[0]=200 所以打印结果: 200,101,102,103
  3. 同2一样分析,需要注意 3[c]=302 => *(c+3)=302 => c[3] =302 => a[3]=302 即打印结果:200,300,301,302
  4. c=c+1 => *c=a[1]=400,打印结果:200,400,301,302

  5. 这里写图片描述
  6. 主要注意认识到int指针变量与char指针变量在地址加一时的不同,由于int变量大小为4个字节char变量大小为1个字节,所以在地址加一时int实际上是加4char实际上是加1。即 b=a+4,c=a+1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值