C语言指针的赋值和初始化的看法

https://blog.csdn.net/liuchunjie11/article/details/80333224

在查看上述博客时,修改代码

#include <stdio.h>
 
const int g_cc = 4;
 
int main()
{
    const int cc = 0x01;
    int* p = (int*)&cc;  

    int* p = NULL;
    *p = (int*)&cc;    //不能运行,编译器提示把int * 赋值给int是错误的,*p回一个int类型的值
     p = (int*)&cc;    //可以运行,(int*)的意思应该理解为:p是一个二级指针,
     p =       &cc;    //可以运行,结果同上    
    *p =       cc ;    //可以运行,结果同上

    printf("cc = %d *p = 0x%x\n",cc,*p);
    
    //cc = 2;  //编译通过,运行错误,因为cc被定义成const局部变量,不能出现在赋值符号左边,运行时导致程序段错误
    *p = 3;    //编译和运行都通过,因为cc是局部变量,所以不管是ANSI还是现代GCC编译器都可以更改,同时也说明了用const修饰变量只是说明这个变量不能出现在赋值符号的左边,但是依然可以更改,但是假如如果cc是全局变量,那就不一定了,如果是ANSI编译器是可以更改的(你可以用BCC编译器试下,BCC就是早期的ANSI编译器)因为早期编译器把const修饰的变量还是存储在全局数据区可以更改,如果是现在的VC或者GCC编译器是不可以更改的,因为现代编译器把const修饰的全局变量存储在全局只读存储区中,更改会出错
    
    printf("cc = %d *p = %d\n",cc,*p);    
    
    p = (int*)&g_cc;
    printf("g_cc = %d *p = %d\n",g_cc,*p);
    
    //*p = 5;  //编译通过,运行错误,因为g_cc被定义成const全局变量,又因为GCC属于现代编译器所以g_cc被分配到全局只读存储区,不能更改,更改导致段错误
    //printf("g_cc = %d *p = %d\n",g_cc,*p);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值