C语言——指针加减

(1)加减

  1. *p+1
    值+1

    #include<stdio.h>
    int main(){
     int i[] = {10, 20, 30, 40, 50};
     int *p = i;
    printf("%d",*p+1); // 11
     return 0;
    }
    
  2. p+1
    地址加一

    #include<stdio.h>
    int main(){
     int i[] = {10, 20, 30, 40, 50};
     int *p = i;
    printf("%d",p+1); // 6422020等同于&i[1]
     return 0;
    }
    

(2)自增自减

  1. *p++等同于 *(p++)
    先取值,然后指针向后移动一位

    #include<stdio.h>
    int main(){
     int i[] = {10, 20, 30, 40, 50};
     int *p = i;
    printf("%d",*p++); // 10
    printf("%d",*p); // 20
     return 0;
    }
    
  2. (*p)++
    先取值,然后值+1

    #include<stdio.h>
    int main(){
     int i[] = {10, 20, 30, 40, 50};
     int *p = i;
    printf("%d",*p++); // 10
    printf("%d",*p); // 11
     return 0;
    }
    
  3. ++*p
    *p的值+1

    #include<stdio.h>
    int main(){
     int i[] = {10, 20, 30, 40, 50};
     int *p = i;
    printf("%d",++*p); // 11
    printf("%d",*p); // 11
     return 0;
    }
    

(3)相加相减

  1. 相加无意义

  2. 相减
    指针相减并不是字节数差值,而是距离,(p1地址-p2地址)/sizeof(int)

    #include<stdio.h>
    int main(){
     int i[] = {10, 20, 30, 40, 50};
     int *p1 = &i[1];
     int *p2 = &i[3];
    printf("%d",p1); // 6422004
    printf("%d",p2); // 6422012
    printf("%d",p2-p1); // 2
     return 0;
    }
    
### 关于C语言指针加减整数的详细解释 #### 原理说明 在C语言中,指针与整数相加或相减的操作并不是简单地将整数直接加上或减去指针存储的地址。相反,这种操作会考虑指针所指向的数据类型的大小。具体来说,如果有一个指针 `p` 和一个整数 `n`,那么表达式 `p + n` 的含义是从当前地址开始向后移动 `n * sizeof(*p)` 字节的位置[^3]。 同样地,在执行 `p - n` 时,则是从当前地址向前移动 `n * sizeof(*p)` 字节的位置。这里的 `sizeof(*p)` 是指针 `p` 所指向的对象类型占用的字节数。因此,指针算术运算实际上是基于对象大小的一种偏移量计算方式。 #### 运算规则 - **指针加法**:对于任意合法定义的指针变量 `p` 及其对应的整型常量或者变量 `i` 来说,`p+i` 或者 `i+p` 都表示从原始位置按步长为 `sizeof(*p)` 向高地址方向前进 i 步后的地址。 - **指针减法**:当两个指针均属于同一数组范围内的有效元素地址时,它们之间的差会被转换成两者间实际间隔多少个相同尺寸单元的数量,并且结果被赋予一种特殊的带符号整数类型——`ptrdiff_t`[^2]。 #### 示例代码展示 下面通过几个具体的例子来演示如何利用这些概念来进行编程实践: ```c #include <stdio.h> int main() { int array[] = {1, 2, 3}; // 定义指向第一个元素的指针 int* p = &array[0]; printf("Address of first element: %p\n", (void*)p); // 让指针指向第二个元素 p += 1; printf("After incrementing by one:\t%p\tValue:%d\n",(void *)p,*p); // 返回到原位再尝试减少一步回到起点前一位理论上越界但编译器允许访问临近区域可能未初始化垃圾数据 p -= 2; printf("Decremented twice back before start:\t%p\tValue(may be garbage):%d\n",(void *)p,*p); return 0; } ``` 在这个程序里展示了基本的指针增量以及反向寻址的过程。需要注意的是最后那部分虽然语法上可行但由于超出了分配给定数组的空间所以读取的内容可能是不确定甚至是危险的行为应该避免这样做除非确切知道整个内存布局情况并确认安全边界之外不会引发任何副作用比如覆盖其他重要资料等等严重后果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值