5.3指针(常量指针与指针常量)

const型变量:

        1.被const关键字修饰的变量具有只读属性

        2.必须在定义的同时初始化

        不可修改!

当const作用于指针

常量指针

指针变量保存的地址可以改变,指向的对象的内存值不能修改

const int* 或 int const*

常量指针常作为函数的输入参数,在避免值复制传递参数开销的同时,有效防止在函数中意外地修改实参

指针常量

指针变量保存的地址不可修改,但内存值可以修改

int* const

数组名就是指针常量

arr++ //不可以,*(arr + i) = 5; //可以修改内存

常量指针常量

指针的目标和指针本身都只读

const int* const或者 int const*const

示例:

//const关键字演示
#include <stdio.h>
int main(void) {
    //1.修饰普通变量
    const int a = 1314; //a以后就是一个常量了,只能查看不能修改,但是必须要初始化
    //a = 250; //不可以
    printf("%d\n", a); //可以
    
    //2.常量指针:此指针变量保存的地址可以修改,但是指向的内存值不允许修改
    int b = 520;
    const int *p = &b; //定义初始化常量指针,p指向的内存b的值不允许修改
    //等价于:int const *p = &b;
    //*p = 250; //不可以
    printf("%d\n", *p); //可以
    
    int c = 521;
    p = &c; //让p来保存的首地址,指向c,可以
    //*p = 250; //不可以
    printf("%d\n", *p); //可以
   
    //3.指针常量:此指针变量保存的地址不允许修改,但是指向的内存数据可以修改
    int d = 522;
    int* const p1 = &d; //定义初始化指针常量,p永远只能指向d
    *p1 = 523; //可以修改
    //p = &c; //不允许修改指向
    printf("%d\n", *p1); //可以
    
    //4.常量指针常量:此指针变量保存的地址不能修改并且指向的内存值也不能修改
    int e = 520;
    const int * const p2 = &e; //p2只能指向e并且通过p2不能修改e
    //*p2 = 521; //不可以
    //p2 = &d; //不可以
    printf("%d\n", *p2); //可以
    return 0;
}

题目:

        int a = 0x12345678; //分配4字节内存

        前提:数据的低位放到内存的低地址,高位放到高地址,利用指针如何访问到其中任意1字节或2字节或4字节数据?

     

//pointer.c:通过有类型指针访问任意大小的内存空间
#include <stdio.h>
int main(void) {
    int a = 0x12345678;
    //1.通过有类型指针访问其中任意1字节数据
    char *p1 = (char *)&a;//将int类型的指针&a强转为char类型的指针赋值给p1,p1保存a的首地址
    printf("%#x\n", *p1++); //0x78
    printf("%#x\n", *p1++); //0x56
    printf("%#x\n", *p1++); //0x34
    printf("%#x\n", *p1++); //0x12
    //2.通过有类型指针访问其中任意2字节数据
    short *p2 = (short *)&a;//将int类型的指针&a强转为short类型的指针赋值给p2,p2保存a的首地址
    printf("%#x\n", *p2++); //0x5678
    printf("%#x\n", *p2++); //0x1234
    //3.通过有类型指针访问其中任意4字节数据
    int *p3 = &a;
    printf("%#x\n", *p3); //0x12345678
    //4.修改任意1字节
    p1 = (char *)&a; //让p1重新指向a的首地址
    *p1++ = 0x12; //0x78->0x12
    *p1++ = 0x34; //0x56->0x34
    *p1++ = 0x56; //0x34->0x56
    *p1++ = 0x78; //0x12->0x78
    //打印验证
    printf("%#x\n", *p3); //0x78563412
    //问:如何打印其中0x5634这两个字节数据呢?一条语句拿下
    printf("%#x\n", *(short *)((char *)&a + 1)); //黑客
    return 0;
} 

        通过无类型指针:

//pointer2.c:通过无类型指针访问任意大小的内存空间
#include <stdio.h>
int main(void) {
    int a = 0x12345678;
    void *p = &a; //p保存a的地址
    //1.通过无类型指针访问其中任意1字节数据,间接法
    char *p1 = (char *)p;//将无类型的指针p强转为char类型的指针赋值给p1,p1保存a的首地址
    printf("%#x\n", *p1++); //0x78
    printf("%#x\n", *p1++); //0x56
    printf("%#x\n", *p1++); //0x34
    printf("%#x\n", *p1++); //0x12
    //直接法
    printf("%#x\n", *(char *)(p+0)); //0x78
    printf("%#x\n", *(char *)(p+1)); //0x56
    printf("%#x\n", *(char *)(p+2)); //0x34
    printf("%#x\n", *(char *)(p+3)); //0x12
    //2.通过无类型指针访问其中任意2字节数据
    short *p2 = (short *)p;//将无类型的指针p强转为short类型的指针赋值给p2,p2保存a的首地址
    printf("%#x\n", *p2++); //0x5678
    printf("%#x\n", *p2++); //0x1234
    //直接法
    printf("%#x\n", *(short *)(p+0)); //0x5678
    printf("%#x\n", *(short *)(p+2)); //0x1234
    //3.通过有类型指针访问其中任意4字节数据
    int *p3 = (int *)p;
    printf("%#x\n", *p3); //0x12345678
    printf("%#x\n", *(int *)p);
    //修改任意1字节或者2字节或者4字节数据
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值