美文网首页iOS源码解析
通过指针修改const变量详解

通过指针修改const变量详解

作者: 哦呵呵y | 来源:发表于2018-03-26 15:15 被阅读92次

本来以为 const 修饰变量就是不可已修改的,但是看了一个关于c语言的视频发现,原来是发现可以修改的,可是自己去实践的时候发现其实没有那么简单。

类型1:
int main(int argc, const char * argv[]) {
    const int a = 10;
    int *p = (int *)&a;
    printf("%p---%p---%p \n", &a, p, &p);
    *p = 20;
    printf("%p---%p---%p \n", &a, p, &p);
    printf("%d--%d \n", a, *p);
    
//    0x7ffeefbff5fc---0x7ffeefbff5fc---0x7ffeefbff5f0
//    0x7ffeefbff5fc---0x7ffeefbff5fc---0x7ffeefbff5f0
//    10--20

    return 0;
}

类型2:
int main(int argc, const char * argv[]) {
    volatile const int a = 10;
    int *p = (int *)&a;
    printf("%p---%p---%p \n", &a, p, &p);
    *p = 20;
    printf("%p---%p---%p \n", &a, p, &p);
    printf("%d--%d \n", a, *p);
    
//    0x7ffeefbff5fc---0x7ffeefbff5fc---0x7ffeefbff5f0
//    0x7ffeefbff5fc---0x7ffeefbff5fc---0x7ffeefbff5f0
//    20--20

    return 0;
}

类型3:
const int a = 10;
int main(int argc, const char * argv[]) {
    int *p = (int *)&a;
    printf("%p---%p---%p \n", &a, p, &p);
    *p = 20;
    printf("%p---%p---%p \n", &a, p, &p);
    printf("%d--%d \n", a, *p);
    
//    0x100001fac---0x100001fac---0x7ffeefbff5f8
// Thread 1: EXC_BAD_ACCESS (code=2, address=0x100001fac)
    return 0;
}

总结:

通过以上三种情况分析,

  1. const局部变量存储在堆栈中,可通过指针修改其值;
  2. const变量在预处理时处理,编译器只对其值读取一次。 所以 例子1中 a输出保持不变,但是例子2中 a 已经被修改
  3. const全局变量存储在全局存储空间,其值只有可读属性,所以例子3中修改会导致崩溃

以上例子在Xcode中实现,不同编译器可能结果不同,因为这都是有编译器的优化导致的。
这里涉及到一个叫常量折叠的概念(常量折叠就是将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。(预编译阶段)), 即编译器虽然会给a分配空间(如果取a的地址进行操作的时候,会强迫编译器进行内存分配), 但是在预编译阶段, 会把所有的a用10替换(这就有点像#define了), 所以虽然&a地址存放的内容改变了, 但是a依然为10.

相关文章

  • 通过指针修改const变量详解

    本来以为 const 修饰变量就是不可已修改的,但是看了一个关于c语言的视频发现,原来是发现可以修改的,可是自己去...

  • const辨析

    const的作用:const变量,表示该变量不可修改。const成员函数,是通过const this指针隐式实现的...

  • const使用

    通过指针可以修改c语言中const修饰变量的值 const_cast

  • const,static,extern详解

    一、�const详解 �如果试图修改由const修饰符修饰所声明的变量,编译器会报错。�const修饰符修饰的指针...

  • 一、C++中的const、define

    C 语言中 在C语言中,const是个假语法,const 中的变量可以通过指针修改,例如: C++中 const ...

  • Const的位置与指针

    Const与指针的组合存在多种可能性: 1. 指向const变量的指针: 也就是说指针指向的变量不可修改,但指...

  • IOS关键字const/static/extern/synthe

    const const用来修饰右边的基本变量或指针变量被修饰的变量只读,不能被修改 static 修饰变量保证局部...

  • const *和* const的区别

    1.const *是指向常量的指针,不能通过指针修改指针所指的值,但是可以修改指针所指的地址 2.* const ...

  • 来自深夜的总结

    一、静态全局变量和静态局部变量 二、const 总结:const 在p的左边,不能修改指针 p。const 在 *...

  • iOS巩基系列(二)——const、static、extern

    const const用来修饰右边的基本变量或指针变量 被修饰的变量只读,不能被修改 static 修饰局部变量在...

网友评论

    本文标题:通过指针修改const变量详解

    本文链接:https://www.haomeiwen.com/subject/mwdrcftx.html