指针的相关定义和运算

交换函数指针变量的基本形式

  • *表示指针运算符。
  • p是一个指向int类型变量的指针。
    int *p;
    

 

 交换函数

void Swap(int *a, int *b) {
    int *t;  // 临时指针
    *t = *a;
    *a = *b;
    *b = *t;
}

指针的运算和操作

  • 通过指针变量中的值找到存储单元。
  • 从指定地址向后偏移对应的字节数(与基类型相关)。
  • 指针运算的结果是另一个变量的地址,或指针本身的值。

 空指针和数组指针

  • NULL 空指针

    NULL 是一个预定义的宏,表示空指针。空指针不指向任何有效内存地址,用于指针初始化和错误检查。

  • 数组名是数组元素地址的常量,其本质是一个指针常量。
  • int main(void) {
        int i = 1;
        char *p = (char*)&i;  // 强制类型转换
        if (*p == 1) {
            printf("little\n");
        } else {
            printf("big\n");
        }
        return 0;
    }
    

    用于判断机器的字节顺序(大小端模式)。

C 语言中,指针加 1 后,指针的值会增加一个步长,该步长取决于指针所指向的数据类型的大小。下面是详细解释及示例。

指针加 1 的内存地址变化

指针运算符 + 会根据指针指向的数据类型移动指针。如:

  • 对于 int 指针,加 1 会使指针增加 4 个字节(假设 int 类型占 4 个字节)。
  • 对于 char 指针,加 1 会使指针增加 1 个字节(char 类型占 1 个字节)。
  • 对于 double 指针,加 1 会使指针增加 8 个字节(假设 double 类型占 8 个字节)。
#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *p = arr;  // 指向数组的首元素

    printf("原始指针地址: %p\n", (void*)p);
    p = p + 1;
    printf("加 1 后的指针地址: %p\n", (void*)p);
    printf("加 1 后的值: %d\n", *p);

    char c_arr[5] = {'a', 'b', 'c', 'd', 'e'};
    char *cp = c_arr;  // 指向字符数组的首元素

    printf("原始字符指针地址: %p\n", (void*)cp);
    cp = cp + 1;
    printf("加 1 后的字符指针地址: %p\n", (void*)cp);
    printf("加 1 后的字符值: %c\n", *cp);

    double d_arr[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
    double *dp = d_arr;  // 指向双精度浮点数数组的首元素

    printf("原始双精度指针地址: %p\n", (void*)dp);
    dp = dp + 1;
    printf("加 1 后的双精度指针地址: %p\n", (void*)dp);
    printf("加 1 后的双精度值: %lf\n", *dp);

    return 0;
}

原始指针地址: 0x7ffeefbff590
加 1 后的指针地址: 0x7ffeefbff594
加 1 后的值: 2
原始字符指针地址: 0x7ffeefbff580
加 1 后的字符指针地址: 0x7ffeefbff581
加 1 后的字符值: b
原始双精度指针地址: 0x7ffeefbff5a0
加 1 后的双精度指针地址: 0x7ffeefbff5a8
加 1 后的双精度值: 2.200000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值