二:一篇文章带你学会指针运算

1. 指针类型的基本信息


- 指针用于保存一个数据对象在内存中的位置。
- 每个数据对象有两个关键信息:首地址和存储空间大小。
- 指针类型存储数据对象的首地址,并通过类型本身标记其空间大小。
- 内存地址是从0开始逐步增加的整数。

2. 指针与整型加减运算


- 指针的值是内存地址,可以与整型进行加减运算。
- 在指针与整型加减运算中,结果会根据目标数据对象的大小(步长)来移动地址。

例如:

#include <stdio.h>

int main() {
    char* pc;
    short* ps;
    int* pn;
    long* pl;
    long long *pll;
    float* pf;
    double* pd;

    // 现将整型转换为对应的指针类型再赋值
    pc = (char *)100;
    ps = (short *)100;
    pn = (int *)100;
    pl = (long *)100;
    pll = (long long *)100;
    pf = (float *)100;
    pd = (double *)100;

    pc = pc + 1;
    ps = ps + 1;
    pn = pn + 1;
    pl = pl + 1;
    pll = pll + 1;
    pf = pf + 1;
    pd = pd + 1;

    printf("pc=%u\n", pc);
    printf("ps=%u\n", ps);
    printf("pn=%u\n", pn);
    printf("pl=%u\n", pl);
    printf("pll=%u\n", pll);
    printf("pf=%u\n", pf);
    printf("pd=%u\n", pd);

    return 0;
}

- 编译会提示不能直接将整型赋值给指针,需要先进行类型转换。
- 加1后,指针地址移动量与数据类型大小相关,比如`char`类型加1移动1字节,`int`类型加1移动4字节。

3. 指针与整型加减应用


- 通过指针操作可以访问和修改变量的值。例如:

#include <stdio.h>

int main() {
    int n1, n2, n3, n4;
    int *p = &n1;

    printf("&n1=%d, &n2=%d, &n3=%d, &n4=%d\n\n", &n1, &n2, &n3, &n4);
    printf("p = %d\n", p);
    printf("p - 1 = %d\n", p - 1);
    printf("p - 2 = %d\n", p - 2);
    printf("p - 3 = %d\n", p - 3);
    putchar('\n');

    *p = 111;
    *(p - 1) = 222;
    *(p - 2) = 333;
    *(p - 3) = 444;

    printf("n1=%d, n2=%d, n3=%d, n4=%d\n", n1, n2, n3, n4);

    return 0;
}


- `p`指向`n1`,`p-1`指向`n2`,依此类推。操作结果为`n1`至`n4`分别被赋值111至444。

4. 同类型指针减法运算


- 指针减法运算依然受步长影响,不同元素间的距离按步长大小计算。
- 数组保证内存连续性,代码示例如下:

#include <stdio.h>

int main() {
    int arr[10];

    printf("&arr[0] = %d\n", &arr[0]);
    printf("&arr[5] = %d\n", &arr[5]);
    printf("&arr[5] - &arr[0] = %d\n", &arr[5] - &arr[0]);

    return 0;
}


```
- 示例中数组`arr[5]`与`arr[0]`相差5个元素,符合步长规律。

5. 无意义的指针运算


- 指针与整型进行乘除运算,同类型指针相加或相乘除,这些运算没有实际意义,在C语言中无法通过编译。

6.总结:


- 指针与整型加减运算的结果与目标数据对象的大小(步长)相关。
- 数组保证内存中各元素连续分布,可以使用指针访问和操作。
- 实际编程中,应注意局部变量内存不连续性,避免依赖指针加减直接访问不同变量。

通过上述指导,你可以对指针运算有一个更清晰的理解,进而在实际编程中灵活应用。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值