指针的初始化和赋值

int main() {
    int i, *p;
    i = 10;
    *p = i;    
}

报错:
警告    C6001    使用未初始化的内存“p”。
错误    C4700    使用了未初始化的局部变量“p”  
 

被指针折磨了很多年,有时候理解,过段时间又忘了。

写个什么来加深一下印象吧。

指针是地址,指针是地址,指针是地址!

看看代码,先看看

int *p;//首先声明了p是个指针变量,其次这个指针变量是指向int类型的。

再看

*p=i;

相信不少初学者都栽在这里,按理说*p=i是把i的值赋给int型的*p,没有任何毛病,为什么会报错?

使用了未初始化的局部变量“p”到底是什么鬼?

当时程序执行到int i时,变量i就有地址了,但是int *p只是说明这是个int类型的地址,地址到底是多少还不知道。

如果一个邮递员,负责一块片区有若干客户,有的是棚户区(char),有平房(short),有商品房(int),有别墅(long),还有企业用户(数组,string),那他手里拿的客户地址就是p,现在要给客户i送快递,这个快递的内容是10,但是老板没有告诉他i的地址,他当然不知所措,没有得到确切的地址之前,只知道这个快递员可能要负责商品房区的快递(int),要注意的是int *p=i,是要把i的值10,存到地址p(p:内存地址)对应的这个房子(*p:存储空间里存放的物品)里,等同于*p=10,但是问题出地址p(p:内存地址)现在还是未知的,也就是所谓的野指针,编译器提示错误算好的了,如果直接编译过了,那程序运行会造成的后果是未知的,如果邮递员为了送出快递,随心所欲的给了任意一个客户。

那怎么解决也就简单了,先告诉邮递员这个i的地址就可以了:

    p = &i;

这样邮递员就建立了于客户i的关系,以后再用*p就可以存取了。

    int i, *p;
    i = 10;
    p = &i;    
    *p = 0;

说点多余的,这个时候*p是0,p是i的地址,&p是p的地址(指针变量的地址),说实话,指针这个名字真的取的不太好,叫地址变量或地址型更加贴切,如果int型地址变量p,更容易记得住不是吗?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值